0

我尝试使用 XPath、Python 和 etree 提取值。我对收到的 .xml 文件没有影响,我认为它似乎在某种程度上无效。

我的方法已经提取了我要检查的文本节点对象。

# This is the tag.
textTag = lastExportTree.xpath("//TEXT_NODE[@PROPERTY = '%s']/TEXT[@ID = '%s']" % (key, id[1]))

# This is a part of the xml. I already have the text node I want to examine.
<TEXT ID="1001" STATE="5" LOCKED="false"><SYSTEMMESSAGE>CALBUY</SYSTEMMESSAGE>Hiho</TEXT>
<TEXT ID="1002" STATE="1" LOCKED="false"/>
<TEXT ID="1003" STATE="5" LOCKED="false">Stack</TEXT>
<TEXT ID="1004" STATE="1" LOCKED="false">Overflow</TEXT>

如果我想访问 ID="1003" 的内容,我只需要输入:

print(textTag.text); # Will print 'Stack'

但是 ID="1001" 的标签还包括 SYSTEMMESSAGE 标签。如何访问内容“HiHo”?(textTag.text 不起作用!)这是我收到的无效 xml 吗?

非常感谢您的回答!

4

2 回答 2

1

我以前也遇到过这个问题,这就是我们最终的结果。在我们的例子中,我们感兴趣的是在一个元素的所有非脚本和非样式子元素中查找文本。

# Just to pre-compile our XPath. This will get all the text from this element from
# each of the child elements that aren't 'script' or 'style'
textXpath = etree.XPath(
    '(.|.//*[not(name()="script")][not(name()="style")])/text()')

# If instead you don't want to include the current element:
# textXpath = etree.XPath(
#   './/*[not(name()="script")][not(name()="style")]/text()')

results = ''.join(textXpath(textTag))

它可能不是最漂亮的代码块,但它是我们所采用的。

于 2013-03-25T20:35:19.143 回答
0

假设您正在向我们展示 lastExportTree 下的节点,应该这样做:

lastExportTree.xpath('TEXT[@STATE="5" and @LOCKED="false" and SYSTEMMESSAGE]/text()')[0]

也就是说要查找所有名为 TEXT 且具有给定 STATE 和 LOCKED 属性以及 SYSTEMMESSAGE 子元素的子节点。

于 2013-03-25T20:34:41.570 回答