2012-11-05 57 views
0

考虑XML片段:如何确定节点是否是libxml2中的叶节点?

... 
<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

你不能使用'lxml'作为libxml的包装器吗? –

+0

嗨@Jon,我在有限的环境中工作; 'libxml2'是可用的,但不是'lxml'。 我可以在本地安装,但其他人试图运行我的代码将不得不一样,这是我想避免的。 –

回答

1

我没有运行python libxml2,但我可以告诉你一些关于libxml2的哲学。文本内容被视为节点,类型为的节点文本。所以你不能依靠你的孩子来计算你的含义叶节点

我想你需要一个遍历所有子节点的功能,并测试是否有任何类型的节点元素。没有元素孩子的意思是一片叶子。

+0

Jarekczek的权利。儿童计数问题的另一个例子:第一个最后将有3个孩子(文本/评论/文本),但我猜你仍然认为它是一个“叶”。检查是否存在元素类型的孩子是唯一的方法。 –

+0

我希望像node.isLeaf()这样简单的东西;所以看起来我必须自己实现它... –

相关问题