Python получает атрибуты XML от нескольких узлов - PullRequest
0 голосов
/ 05 июня 2018

Входной XML

<component>
    <section classCode="DOCSECT" moodCode="EVN">
        <organizer classCode="CLUSTER" moodCode="EVN">
            <code code="46680005" codeSystem="2.16.840.1.113883.6.96" displayName="Vital signs"/>
            <component>
                <observation classCode="OBS" moodCode="EVN">
                    <templateId root="2.16.840.1.113883.10.20.22.4.27"/>
                    <id root="fe4dc35f-ea98-4d3c-844f-3098e3419a59"/>
                    <code code="8302-2" displayName="Height"/>
                    <statusCode code="completed"/>
                    <effectiveTime value="20110130"/>
                    <value unit="Inches" value="61.2598" xsi:type="PQ"/>
                </observation>
            </component>
            <component>
                <observation classCode="OBS" moodCode="EVN">
                    <templateId root="2.16.840.1.113883.10.20.22.4.27"/>
                    <id root="95f747ac-c3f5-4de0-84eb-29f20d68e571"/>
                    <code code="3141-9" displayName="Weight"/>
                    <statusCode code="completed"/>
                    <effectiveTime value="20110130"/>
                    <value unit="lbs" value="108.00" xsi:type="PQ"/>
                </observation>
            </component>
        </organizer>
    </section>
</component>

Входное пространство имен

<ClinicalDocument xmlns="urn:hl7-org:v3" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" moodCode="EVN">

Код

from xml.etree import ElementTree

tree = ElementTree.parse(sample_string)
root = tree.getroot()

for each in root.findall(".//{urn:hl7-org:v3}observation/{urn:hl7-org:v3}code[@displayName='Height']"):
    print(each.attrib)

Ouput

{'code': '8302-2', 'displayName': 'Height'}

Вопрос

Я хочу получить доступ к valueTime value = "", code = "", displayName = "", unit =" "и value =" ".Но так как есть несколько атрибутов с одинаковыми именами, такими как код и значение, я не знаю, как добраться до определенных элементов.Я не рассчитываю на помощь в форматировании вывода, но нарисую четкое изображение, в конце я пытаюсь получить вывод в виде ..

date, code, display_name, value, unit
20110130, 8302-2, Height, 61.2598, Inches

Любая помощь действительно ценится.

1 Ответ

0 голосов
/ 06 июня 2018

Вот запрос Xpath 1.0, который получает ожидаемый результат.Протестировано с XML без пространств имен, так как OP не опубликовал полный образец

"//observation[code[@displayName="Height"]]/*[self::effectiveTime | self::value | self::code]/@*[name()="value" or name()="unit" or name()="displayName"]

Части деталей XPath:

  • Получить узел, содержащий интересные узлы: "//observation[code[@displayName="Height"]]"
  • Получить интересные узлы "*[self::effectiveTime | self::value | self::code]" дочерние узлы выше.Имеется в виду любой узел, который является validTime, значением или кодом.
  • Учитывая приведенные выше узлы, получить атрибуты, имена которых имеют значение, единицу измерения или имя_игры: "@*[name()="value" or name()="unit" or name()="displayName"]"

Тестирование в командной строке

xmllint --xpath '//observation[code[@displayName="Height"]]/*[self::effectiveTime | self::value | self::code]/@*[name()="value" or name()="unit" or name()="displayName"]' test.xml | tr ' ' '\n'; echo

Результат, атрибутыпоявляются в порядке документа:

displayName="Height"
value="20110130"
unit="Inches"
value="61.2598"

В случае возникновения проблем найдите узел, содержащий ожидаемые значения, а затем найдите их, взяв его в качестве ссылки

// find an observation node containing a code node with a displayName attribute = "Height"
refNode = root.find(".//{urn:hl7-org:v3}observation[{urn:hl7-org:v3}code[@displayName='Height']]")
for each in refNode.findall("some xpath"):
   ...
...