如何只使用一个函数读取 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.xml
或file2.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
个子元素。
等等,你应该明白了。
假设,我有以下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.xml
或file2.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
个子元素。
等等,你应该明白了。