【问题标题】:Parsing Autosar arxml using beautiful soup or any other method in python使用漂亮的汤或python中的任何其他方法解析Autosar arxml
【发布时间】:2020-05-01 18:52:45
【问题描述】:

我正在处理 autosar 文件,在 Autosar 我们使用 .arxml 文件, 在下面的 arxml 文件中,我想要解析一些数据(DTC 值 ex:112068)

.arxml:

  <ECUC-CONTAINER-VALUE>
   <SHORT-NAME>DTC_AD</SHORT-NAME>
   <DEFINITION-REF DEST="ECUC-PARAM-CONF-CONTAINER-DEF">/AUTOSAR_Dem/EcucModuleDefs/Dem/DemConfigSet/DemDTCClass</DEFINITION-REF>
   <PARAMETER-VALUES>
    <ECUC-NUMERICAL-PARAM-VALUE>
     <DEFINITION-REF DEST="ECUC-INTEGER-PARAM-DEF">/AUTOSAR_Dem/EcucModuleDefs/Dem/DemConfigSet/DemDTCClass/DemDTC</DEFINITION-REF>
     <VALUE>112068</VALUE>
    </ECUC-NUMERICAL-PARAM-VALUE>
    <ECUC-TEXTUAL-PARAM-VALUE>
     <DEFINITION-REF DEST="ECUC-STRING-PARAM-DEF">/AUTOSAR_Dem/EcucModuleDefs/Dem/DemConfigSet/DemDTCClass/DemDTCDescription</DEFINITION-REF>
     <VALUE>AD temp</VALUE>
    </ECUC-TEXTUAL-PARAM-VALUE>
    <ECUC-NUMERICAL-PARAM-VALUE>
     <DEFINITION-REF DEST="ECUC-INTEGER-PARAM-DEF">/AUTOSAR_Dem/EcucModuleDefs/Dem/DemConfigSet/DemDTCClass/DemDTCFunctionalUnit</DEFINITION-REF>
     <VALUE>1</VALUE>
    </ECUC-NUMERICAL-PARAM-VALUE>
   </PARAMETER-VALUES>
  </ECUC-CONTAINER-VALUE>
  <ECUC-CONTAINER-VALUE>
   <SHORT-NAME>DTC_Lost</SHORT-NAME>
   <DEFINITION-REF DEST="ECUC-PARAM-CONF-CONTAINER-DEF">/AUTOSAR_Dem/EcucModuleDefs/Dem/DemConfigSet/DemDTCClass</DEFINITION-REF>
   <PARAMETER-VALUES>
    <ECUC-NUMERICAL-PARAM-VALUE>
     <DEFINITION-REF DEST="ECUC-INTEGER-PARAM-DEF">/AUTOSAR_Dem/EcucModuleDefs/Dem/DemConfigSet/DemDTCClass/DemDTC</DEFINITION-REF>
     <VALUE>126630</VALUE>
    </ECUC-NUMERICAL-PARAM-VALUE>
    <ECUC-TEXTUAL-PARAM-VALUE>
     <DEFINITION-REF DEST="ECUC-STRING-PARAM-DEF">/AUTOSAR_Dem/EcucModuleDefs/Dem/DemConfigSet/DemDTCClass/DemDTCDescription</DEFINITION-REF>
     <VALUE>LostCOMM</VALUE>
    </ECUC-TEXTUAL-PARAM-VALUE>
    <ECUC-NUMERICAL-PARAM-VALUE>
     <DEFINITION-REF DEST="ECUC-INTEGER-PARAM-DEF">/AUTOSAR_Dem/EcucModuleDefs/Dem/DemConfigSet/DemDTCClass/DemDTCFunctionalUnit</DEFINITION-REF>
     <VALUE>1</VALUE>
    </ECUC-NUMERICAL-PARAM-VALUE>
   </PARAMETER-VALUES>
  </ECUC-CONTAINER-VALUE>

我也试过下面的代码,但没有得到想要的输出:

from bs4 import BeautifulSoup as Soup

def diff_method():
    handler = open('Dem_PRJ_8CH_EcucValues.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 (def_ref.get_text() == '/AUTOSAR_Dem/EcucModuleDefs/Dem/DemConfigSet/DemDTCClass/DemDTC'):
                print(ecuc_container.get_text())

if __name__ == "__main__":

    diff_method()

预期输出:

112068
126630

【问题讨论】:

    标签: python beautifulsoup xml-parsing html-parsing


    【解决方案1】:

    如果handler 变量是问题中的XML 文本,您可以使用此示例从&lt;value&gt; 标签中获取值:

    from bs4 import BeautifulSoup
    
    soup = BeautifulSoup(handler, 'html.parser')
    
    for definition in soup.select('definition-ref:has(~ value)'):
        if definition.get_text(strip=True) == '/AUTOSAR_Dem/EcucModuleDefs/Dem/DemConfigSet/DemDTCClass/DemDTC':
            print(definition.find_next('value').text)
    

    打印:

    112068
    126630
    

    【讨论】:

    • 它不工作......我已经测试了下面的错误:for definition in soup.select('definition-ref:has(~ value)'): '只实现了以下伪类:nth -of-type.') NotImplementedError:仅实现以下伪类:nth-​​of-type.
    • @Techblog 看来您使用的是旧版本的bs4。更新它,它会工作。
    猜你喜欢
    • 1970-01-01
    • 2013-03-21
    • 2015-07-03
    • 2017-05-23
    • 2021-03-06
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多