Разбор Autosar ar xml с использованием красивого супа или любого другого метода в python - PullRequest
0 голосов
/ 15 января 2020

Я работаю с файлами автосар, в Autosar мы используем файлы .ar xml, ниже файл ar xml, я хочу получить некоторые данные (DT C значение, например: 112068)

.ar xml:

  <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

1 Ответ

1 голос
/ 15 января 2020

Если в переменной handler указан XML текст вопроса, вы можете использовать этот пример для получения значений из тегов <value>:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...