如何确定节点是否是libxml2中的叶节点?

时间:2012-11-05 19:02:47

标签: python libxml2

考虑一下xml:

...
<DataType>
 <name>AccountStatus</name>
 <description>This field indicates the account status</description>
 <ValidValue>
  <value>A</value>
  <description>Account is Active</description>
  <name>ACTIVE</name>
 </ValidValue>
 <ValidValue>
  <value>I</value>
  <description>Account is Inactive</description>
  <name>INACTIVE</name>
 </ValidValue>
</DataType>
<DataType>
 <name>
 ...

我想知道给定节点是否是叶子节点。 例如,“name”,“description”和“value”是叶节点。 “ValidValue”不是因为它包含子元素。

这就是我的尝试:

import libxml2
doc       = libxml2.parseFile("data_types.xml")
xml_query = doc.xpathNewContext()
node_list = xml_query.xpathEval('/path/to/DataType')
for node in node_list:
    print '%s' % k.get_children()
    print '%s' % k.isText()

不知何故,get_children()和isText()表现得很奇怪。 isText()为“name”节点(?)返回0,我无法确定如何处理get_children()的输出。

当然,我可以将其他东西放到另一个xpath查询中并弄明白,但我怀疑应该有一种非常直接的方法来使用libxml2这样做,这正是我正在寻找的。

1 个答案:

答案 0 :(得分:1)

我没有运行python libxml2,但我可以告诉你一些关于libxml2哲学的内容。文本内容被视为节点,类型为 text 的节点。因此,您不能依赖于叶节点的含义对孩子进行计数。

我认为您需要一个遍历所有子节点的函数,并测试是否存在元素类型的节点。没有元素孩子意味着成为一片叶子。