首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用漂亮汤python 3解析Autosar xml

使用漂亮汤python 3解析Autosar xml
EN

Stack Overflow用户
提问于 2019-05-06 06:20:18
回答 2查看 3.2K关注 0票数 2

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

代码语言:javascript
复制
/AUTOSAR/ecucdef/BswM/BswMConfig/BswMArbitration/BswMLogicalExpression/BswMArgumentRef

我尝试了多种方法,但我无法打印出内容。

代码语言:javascript
复制
from bs4 import BeautifulSoup as Soup

def parseArxml():
    handler = open('input.arxml').read()
    soup = Soup(handler,"html.parser")
    for ecuc_container in soup.findAll('ECUC-CONTAINER-VALUE'):
        print(ecuc_container)

if __name__ == "__main__":
    parseArxml()

下面是arxml文件的一部分:

代码语言:javascript
复制
<?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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-06 07:05:53

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

代码语言:javascript
复制
for ecuc_container in soup.findAll('ECUC-CONTAINER-VALUE'.lower()):

或者简单地说:

代码语言:javascript
复制
for ecuc_container in soup.findAll('ecuc-container-value'):

或者更好的是:将文档显式地解析为XML,这样标记的大小写就不会被修改:

代码语言:javascript
复制
soup = Soup(handler,'xml')

下面是如何获取<DEFINITION-REF DEST="ECUC-PARAM-CONF-CONTAINER-DEF">元素中文本的列表:

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
['/AUTOSAR/ecucdef/BswM/BswMConfig/BswMArbitration/BswMLogicalExpression/BswMArgumentRef',
'/AUTOSAR/ecucdef/BswM/BswMConfig/BswMArbitration/BswMLogicalExpression/BswMArgumentRef']

或者,如果您想获取所有definition-ref标记,而不管属性是什么,请使用

代码语言:javascript
复制
dest = [d.text for d in soup.findAll('definition-ref')] 
票数 0
EN

Stack Overflow用户

发布于 2019-05-06 07:05:49

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

你应该这么做:

代码语言:javascript
复制
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()

输出:

代码语言:javascript
复制
/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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55999739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档