Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python 3解析Autosar xml_Python_Python 3.x_Parsing_Beautifulsoup_Xml Parsing - Fatal编程技术网

使用python 3解析Autosar xml

使用python 3解析Autosar xml,python,python-3.x,parsing,beautifulsoup,xml-parsing,Python,Python 3.x,Parsing,Beautifulsoup,Xml Parsing,我试图使用Python解析特定于AUTOSAR的arxml(类似于xml文件),但无法读取文件的内容。我想获取多个ECUC-CONTAINER-VALUE标记中定义的DEFINITION-REF值,例如: /AUTOSAR/ecucdef/BswM/BswMConfig/BswMArbitration/BswMLogicalExpression/BswMArgumentRef 我尝试了多种方法,但无法打印出内容 从bs4导入BeautifulSoup作为汤 def parseArxml():

我试图使用Python解析特定于AUTOSAR的arxml(类似于xml文件),但无法读取文件的内容。我想获取多个
ECUC-CONTAINER-VALUE
标记中定义的
DEFINITION-REF
值,例如:

/AUTOSAR/ecucdef/BswM/BswMConfig/BswMArbitration/BswMLogicalExpression/BswMArgumentRef
我尝试了多种方法,但无法打印出内容

从bs4导入BeautifulSoup作为汤
def parseArxml():
handler=open('input.arxml').read()
soup=soup(处理程序,“html.parser”)
对于soup.findAll中的ecuc_容器(“ecuc-container-VALUE”):
打印(ecuc_容器)
如果名称=“\uuuuu main\uuuuuuuu”:
parseArxml()
以下是arxml文件的一部分:

<?xml version="1.0" encoding="UTF-8"?>
<AUTOSAR xmlns="http://autosar.org/schema/r4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://autosar.org/schema/r4.0 autosar_4-2-1.xsd">
      <ECUC-CONTAINER-VALUE UUID="c112c504-e546-41c3-abf9-0aaf06b18284">
      <SHORT-NAME>BswMLogicalExpression_2</SHORT-NAME>
      <DEFINITION-REF DEST="ECUC-PARAM-CONF-CONTAINER-DEF">/AUTOSAR/ecucdef/BswM/BswMConfig/BswMArbitration/BswMLogicalExpression</DEFINITION-REF>
      <REFERENCE-VALUES>
        <ECUC-REFERENCE-VALUE>
          <DEFINITION-REF DEST="ECUC-CHOICE-REFERENCE-DEF">/AUTOSAR/ecucdef/BswM/BswMConfig/BswMArbitration/BswMLogicalExpression/BswMArgumentRef</DEFINITION-REF>
          <VALUE-REF DEST="ECUC-CONTAINER-VALUE">/ARRoot/BswM_0/BswMConfig_0/BswMArbitration_0/BswMModeCondition_2</VALUE-REF>
        </ECUC-REFERENCE-VALUE>
      </REFERENCE-VALUES>
    </ECUC-CONTAINER-VALUE>

    <ECUC-CONTAINER-VALUE UUID="c112c504-e546-41c3-abf9-0aaf06b18284">
      <SHORT-NAME>BswMLogicalExpression_3</SHORT-NAME>
      <DEFINITION-REF DEST="ECUC-PARAM-CONF-CONTAINER-DEF">/AUTOSAR/ecucdef/BswM/BswMConfig/BswMArbitration/BswMLogicalExpression</DEFINITION-REF>
      <REFERENCE-VALUES>
        <ECUC-REFERENCE-VALUE>
          <DEFINITION-REF DEST="ECUC-CHOICE-REFERENCE-DEF">/AUTOSAR/ecucdef/BswM/BswMConfig/BswMArbitration/BswMLogicalExpression/BswMArgumentRef</DEFINITION-REF>
          <VALUE-REF DEST="ECUC-CONTAINER-VALUE">/ARRoot/BswM_2/BswMConfig_2/BswMArbitration_2/BswMModeCondition_3</VALUE-REF>
        </ECUC-REFERENCE-VALUE>
      </REFERENCE-VALUES>
    </ECUC-CONTAINER-VALUE>
</AUTOSAR>

BswMLogicalExpression_2
/AUTOSAR/ecucdef/BswM/BswMConfig/BswM仲裁/BSWMLogicalPression
/AUTOSAR/ecucdef/BswM/BswMConfig/BswM仲裁/BSWMLogicalPression/BswMArgumentRef
/ARRoot/BswM_0/BswMConfig_0/BswM仲裁_0/BSWMMODE条件_2
BswMLogicalExpression_3
/AUTOSAR/ecucdef/BswM/BswMConfig/BswM仲裁/BSWMLogicalPression
/AUTOSAR/ecucdef/BswM/BswMConfig/BswM仲裁/BSWMLogicalPression/BswMArgumentRef
/ARRoot/BswM_2/BswMConfig_2/BswM仲裁_2/BSWMMODE条件_3

似乎您的解析器和BeautifulSoup版本正在将标记转换为小写

您应该这样做:

from bs4 import BeautifulSoup as Soup

def parseArxml():
    handler = open('input.arxml').read()
    soup = Soup(handler,"html.parser")
    for ecuc_container in soup.find_all('ecuc-container-value'):
        for def_ref in ecuc_container.find_all('definition-ref'):
            print(def_ref.get_text())

if __name__ == "__main__":
    parseArxml()
输出:

/AUTOSAR/ecucdef/BswM/BswMConfig/BswMArbitration/BswMLogicalExpression
/AUTOSAR/ecucdef/BswM/BswMConfig/BswMArbitration/BswMLogicalExpression/BswMArgumentRef
/AUTOSAR/ecucdef/BswM/BswMConfig/BswMArbitration/BswMLogicalExpression
/AUTOSAR/ecucdef/BswM/BswMConfig/BswMArbitration/BswMLogicalExpression/BswMArgumentRef

您将通过
print(soup)
看到解析器将标记名转换为小写。因此,在搜索标记名时使用小写:

for ecuc_container in soup.findAll('ECUC-CONTAINER-VALUE'.lower()):
或者简单地说:

for ecuc_container in soup.findAll('ecuc-container-value'):
或者更好:将文档显式解析为XML,这样就不会修改标记的大小写:

soup = Soup(handler,'xml')
以下是如何获得
元素中的文本列表:

def parseArxml():
    handler = open('input.arxml').read()
    soup = Soup(handler,'xml')
    dest = [d.text for d in soup.findAll('DEFINITION-REF') if d['DEST']=='ECUC-CHOICE-REFERENCE-DEF']   
    print(dest)
输出:

['/AUTOSAR/ecucdef/BswM/BswMConfig/BswMArbitration/BswMLogicalExpression/BswMArgumentRef',
'/AUTOSAR/ecucdef/BswM/BswMConfig/BswMArbitration/BswMLogicalExpression/BswMArgumentRef']
或者,如果您想获取所有
定义参考
标记,而不考虑属性,请使用

dest = [d.text for d in soup.findAll('definition-ref')] 

谢谢我甚至尝试使用“lxml-xml”解析器来处理BeautifulSoup,但标记的大小写并没有修改。(这个案子无关紧要)。你能告诉我哪种解析器最适合用于更复杂的XML文件吗?我建议使用
soup=soup(handler,'XML')
将文档显式解析为XML。这将保留大写字母。还可以考虑使用纯的XML解析器,如EntEngEt或LXML,而不是使用漂亮的汤,如果XML格式良好。ElementTree工作得很好,遍历xml就像一棵树。谢谢:)