Python从多个节点获取XML属性

时间:2018-06-05 20:38:31

标签: python xml xpath elementtree

输入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)

输出继电器

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

问题

我想访问effectiveTime value =“”,code =“”,displayName =“”,unit =“”和value =“”。 但由于有多个属性与代码和值相同,我不知道如何到达特定元素。我不希望帮助格式化输出,但绘制一个清晰的图片,最后我试图在表单中输出..

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

真正感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

这是一个获得预期结果的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]"子节点。表示任何有效时间,值或代码的节点。
  • 鉴于上述节点,获取名称为value,unit或diaplayName的属性:"@*[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"):
   ...