如何使用 ElementTree 在 xml 文件中搜索标签,其中我有一个具有特定值的“父”标签?(Python)

Jan*_*ani 6 python xml xpath parsing elementtree

我刚开始学习 Python,必须编写一个程序来解析 xml 文件。我必须在 2 个不同的文件中找到一个名为 OrganisationReference 的标签并返回它。实际上,有多个具有此名称的标签,但只有一个,即我要返回的标签,它的 Tag OrganisationType 值为 DEALER 作为父标签(不太确定该术语是否正确)。我尝试为此使用 ElementTree。这是代码:

    import xml.etree.ElementTree as ET

    tree1 = ET.parse('Master1.xml')
    root1 = tree1.getroot()

    tree2 = ET.parse('Master2.xml')
    root2 = tree2.getroot()

    for OrganisationReference in root1.findall("./Organisation/OrganisationId/[@OrganisationType='DEALER']/OrganisationReference"):
        print(OrganisationReference.attrib)

    for OrganisationReference in root2.findall("./Organisation/OrganisationId/[@OrganisationType='DEALER']/OrganisationReference"):
        print(OrganisationReference.attrib)
Run Code Online (Sandbox Code Playgroud)

但这不返回任何内容(也没有错误)。有人可以帮助我吗?

我的文件看起来像这样:

  <MessageOrganisationCount>a</MessageOrganisationCount>
  <MessageVehicleCount>x</MessageVehicleCount>
  <MessageCreditLineCount>y</MessageCreditLineCount>
  <MessagePlanCount>z</MessagePlanCount>
  <OrganisationData>
      <Organisation>
          <OrganisationId>
              <OrganisationType>DEALER</OrganisationType>
              <OrganisationReference>WHATINEED</OrganisationReference>
          </OrganisationId>
          <OrganisationName>XYZ.</OrganisationName>
 ....
Run Code Online (Sandbox Code Playgroud)

由于 OrganisationReference 在这个文件中出现了几次,并且在开始和结束标签之间有不同的文本,我想得到你在第 9 行看到的那个:它有一个 OrganisationId 作为父标签,DEALER 也是一个OrganizationId 的子标签。

Dan*_*ley 7

您与最初的尝试非常接近。您只需要对 xpath 进行一些更改并对 python 进行一些微小的更改。

xpath 的第一部分以./Organization. 由于您是从 root 执行 xpath,因此它Organization应该是一个孩子。它不是; 它是一个后代。

尝试更改./Organization.//Organization. (//是 的缩写/descendant-or-self::node()/有关更多信息,请参见此处。

第二个问题是与OrganisationId/[@OrganisationType='DEALER']. 那是无效的 xpath。该/应从之间被删除OrganisationId谓语

此外,@attribute:: 轴的缩写语法,OrganisationType是一个元素,而不是一个属性。

尝试更改OrganisationId/[@OrganisationType='DEALER']OrganisationId[OrganisationType='DEALER'].

python 问题在于print(OrganisationReference.attrib). 在OrganisationReference没有任何属性; 只是文字。

尝试更改print(OrganisationReference.attrib)print(OrganisationReference.text).

这是一个仅使用一个 XML 文件进行演示的示例...

XML 输入(Master1.xml;doc添加了元素以使其格式良好)

<doc>
    <MessageOrganisationCount>a</MessageOrganisationCount>
    <MessageVehicleCount>x</MessageVehicleCount>
    <MessageCreditLineCount>y</MessageCreditLineCount>
    <MessagePlanCount>z</MessagePlanCount>
    <OrganisationData>
        <Organisation>
            <OrganisationId>
                <OrganisationType>DEALER</OrganisationType>
                <OrganisationReference>WHATINEED</OrganisationReference>
            </OrganisationId>
            <OrganisationName>XYZ.</OrganisationName>
        </Organisation>
    </OrganisationData>
</doc>
Run Code Online (Sandbox Code Playgroud)

Python

import xml.etree.ElementTree as ET

tree1 = ET.parse('Master1.xml')
root1 = tree1.getroot()

for OrganisationReference in root1.findall(".//Organisation/OrganisationId[OrganisationType='DEALER']/OrganisationReference"):
    print(OrganisationReference.text)
Run Code Online (Sandbox Code Playgroud)

打印输出

WHATINEED
Run Code Online (Sandbox Code Playgroud)

另请注意,您似乎根本不需要使用getroot()。您可以findall()直接在树上使用...

import xml.etree.ElementTree as ET

tree1 = ET.parse('Master1.xml')

for OrganisationReference in tree1.findall(".//Organisation/OrganisationId[OrganisationType='DEALER']/OrganisationReference"):
    print(OrganisationReference.text)
Run Code Online (Sandbox Code Playgroud)