0

假设,我有以下 3 种 XML 文件:

file1.xml

<memberdef>
    <param>
        <type>abc12300xyz__param -> type</type>
    </param>
</memberdef>

file2.xml

<memberdef>
    <param>
        <type>abc12300xyz__param -> type</type>
        <declname>abc12300xyz__param -> declname</declname>
    </param>
</memberdef>

file3.xml

<memberdef>
    <param>
        <type>
            <ref refid="abc12300xyz__refid" kindref="abc12300xyz__kindref">abc12300xyz -> ref</ref>
        </type>
        <declname>abc12300xyz__param -> declname</declname>
    </param>
</memberdef>

假设,我想使用LXML读取这三个文件。

我如何知道/测试加载了哪个文件?

例如,当加载file1.xml或时file2.xml,以下源代码将失败:

if memberdef.param.type.ref != None:
    ... ... ...
    ... ... ...

在这种情况下我应该使用什么策略?

4

1 回答 1

1

您可以使用这个简单的 XPath 检查元素是否存在(替换fileX.xml)。如果元素存在于给定的 XML 文件中,XPath 表达式只会返回非空结果。在下面的示例中,测试从非常具体到更一般:

from lxml import etree

print("Checking variants...")
root = etree.parse("fileX.xml")
if root.xpath('/memberdef[param[type/ref and declname]]'):
    print("Third variant.")
elif root.xpath('/memberdef[param[type and declname]]'):
    print("Second variant.")
elif root.xpath('/memberdef/param[type]'):
    print("First variant.")
else:
    print("None of the given variants.")

所以

  • 第一个 IF 检查元素是否有一个子元素,该子memberdef元素有一个param子元素type/ref和一个子元素declname
  • 第二个 IF 只检查memberdef元素是否有一个param有一个type孩子和一个孩子的declname孩子。
  • 第三个 IF 检查memberdef元素是否有一个有param子元素的子元素type

等等,你应该明白要点。

于 2021-02-18T00:33:27.843 回答