Разбор Autosar xml с помощью красивого супа питона 3 - PullRequest
2 голосов
/ 06 мая 2019

Я пытаюсь проанализировать специфичный для AUTOSAR arxml (аналог файла xml), используя Python, но не могу прочитать содержимое файла. Я хочу получить DEFINITION-REF значения определений внутри нескольких тегов ECUC-CONTAINER-VALUE, например:

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

Я пробовал несколько способов, но не могу распечатать содержимое.

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:

<?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>

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

Вы увидите 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')

Вот как вы можете получить список текста внутри <DEFINITION-REF DEST="ECUC-PARAM-CONF-CONTAINER-DEF"> элементов:

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']

Или, если хотитечтобы получить все теги definition-ref независимо от атрибута, используйте

dest = [d.text for d in soup.findAll('definition-ref')] 
0 голосов
/ 06 мая 2019

Кажется, ваш парсер и версия 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
...