如何只使用一个函数读取 3 种 XML 文件?

How can I read 3 kinds of XML files using only one function?

假设,我有以下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读取这三个文件。

如何know/test加载哪个文件?

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

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

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

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

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 个子元素,而这个 param 个子元素有一个 type 个子元素。

等等,你应该明白了。