我尝试使用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吗?
非常感谢您的回答!
答案 0 :(得分: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))
它可能不是最漂亮的代码块,但它是我们所使用的。
答案 1 :(得分:0)
假设您向我们展示了lastExportTree下的节点,那么应该这样做:
lastExportTree.xpath('TEXT[@STATE="5" and @LOCKED="false" and SYSTEMMESSAGE]/text()')[0]
这就是找到所有名为TEXT的子节点,它们具有给定的STATE和LOCKED属性以及SYSTEMMESSAGE子元素。