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]

これは、指定されたSTATE属性とLOCKED属性、およびSYSTEMMESSAGE子要素を持つTEXTという名前のすべての子ノードを検索することを意味します。

于 2013-03-25T20:34:41.570 に答える