【问题标题】:Tips for finding prefixed tags in python lxml?在 python lxml 中查找前缀标签的提示?
【发布时间】:2011-12-02 17:55:34
【问题描述】:

我正在尝试使用 lxml 的 ElementTree etree 在我的 xml 文档中查找特定标签。 标签如下所示:

<text:ageInformation>
    <text:statedAge>12</text:statedAge>
</text:ageInformation>

我希望使用 etree.find('text:statedAge'),但该方法不喜欢 'text' 前缀。 它提到我应该在前缀映射中添加“文本”,但我不确定该怎么做。有什么建议吗?

编辑: 我希望能够写入 hr4e 前缀标签。 以下是文档的重要部分:

<?xml version="1.0" encoding="utf-8"?>
<greenCCD xmlns="AlschulerAssociates::GreenCDA" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:hr4e="hr4e::patientdata" xsi:schemaLocation="AlschulerAssociates::GreenCDA green_ccd.xsd">
  <header>
    <documentID root="18c41e51-5f4d-4d15-993e-2a932fed720a" />
    <title>Health Records for Everyone Continuity of Care Document</title>
    <version>
  <number>1</number>
</version>
<confidentiality codeSystem="2.16.840.1.113883.5.25" code="N" />
<documentTimestamp value="201105300211+0800" />
<personalInformation>
  <patientInformation>
    <personID root="2.16.840.1.113883.3.881.PI13023911" />
    <personAddress>
      <streetAddressLine nullFlavor="NI" />
      <city>Santa Cruz</city>
      <state nullFlavor="NI" />
      <postalCode nullFlavor="NI" />
    </personAddress>
    <personPhone nullFlavor="NI" />
    <personInformation>
      <personName>
        <given>Benjamin</given>
        <family>Keidan</family>
      </personName>
      <gender codeSystem="2.16.840.1.113883.5.1" code="M" />
      <personDateOfBirth value="NI" />
      <hr4e:ageInformation>
        <hr4e:statedAge>9424</hr4e:statedAge>
        <hr4e:estimatedAge>0912</hr4e:estimatedAge>
        <hr4e:yearInSchool>1</hr4e:yearInSchool>
        <hr4e:statusInSchool>attending</hr4e:statusInSchool>
      </hr4e:ageInformation>
    </personInformation>
    <hr4e:livingSituation>
      <hr4e:homeVillage>Putney</hr4e:homeVillage>
      <hr4e:tribe>Oromo</hr4e:tribe>
    </hr4e:livingSituation>
  </patientInformation>
</personalInformation>

【问题讨论】:

    标签: lxml xml-namespaces


    【解决方案1】:

    名称空间前缀必须在 XML 文档中声明(映射到 URI)。然后您可以使用{URI}localname notation 查找text:statedAge 和其他元素。像这样的:

    from lxml import etree
    
    XML = """
    <root xmlns:text="http://example.com">
     <text:ageInformation>
       <text:statedAge>12</text:statedAge>
     </text:ageInformation>
    </root>"""
    
    root = etree.fromstring(XML)
    
    ageinfo = root.find("{http://example.com}ageInformation")
    age = ageinfo.find("{http://example.com}statedAge")
    print age.text
    

    这将打印“12”。

    另一种方法:

    ageinfo = root.find("text:ageInformation",
                        namespaces={"text": "http://example.com"})
    age = ageinfo.find("text:statedAge",
                       namespaces={"text": "http://example.com"})
    print age.text
    

    你也可以使用XPath:

    age = root.xpath("//text:statedAge",
                     namespaces={"text": "http://example.com"})[0]
    print age.text
    

    【讨论】:

    • 我不断收到 NoneTypes... w3.org/2001/XMLSchema-instance" xmlns:hr4e="hr4e::patientdata" xsi:schemaLocation="AlschulerAssociates ::GreenCDA green_ccd.xsd"> 是我文档的根目录。我试过 ageInfo = root.find("{hr4e::patientdata}ageInformation")
    • @super:如果您提供一个完整的示例 XML 文档(更新问题)会有所帮助。
    【解决方案2】:

    我最终不得不使用嵌套前缀:

    from lxml import etree
    
    XML = """
    <greenCCD xmlns="AlschulerAssociates::GreenCDA" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:hr4e="hr4e::patientdata"  xsi:schemaLocation="AlschulerAssociates::GreenCDA green_ccd.xsd">
    <personInformation>
     <hr4e:ageInformation>
       <hr4e:statedAge>12</hr4e:statedAge>
     </hr4e:ageInformation>
    </personInformation>
    </greenCCD>"""
    
    root = etree.fromstring(XML)
    #root = etree.parse("hr4e_patient.xml")
    
    ageinfo = root.find("{AlschulerAssociates::GreenCDA}personInformation/{hr4e::patientdata}ageInformation")
    age = ageinfo.find("{hr4e::patientdata}statedAge")
    print age.text
    

    【讨论】:

    • 非常适合您(考虑到省略了有关实际命名空间的重要信息,我认为我对原始问题的回答非常好)。
    • 如果没有您的帮助,我不会找到我的解决方案。非常感谢先生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    相关资源
    最近更新 更多