21

特定のタグが xml ファイルに存在するかどうかを確認する必要があります。

たとえば、このスニペットにタグが存在するかどうかを確認したい:

 <main>
       <elem1/>
       <elem2>Hi</elem2>
       <elem3/>
       ...
 </main>

現在、私は次のようなエラーチェック付きの醜いハックを使用しています:

try:
   if root.elem1.tag:
      foo = elem1
except AttributeError:
   foo = "error finding elem1"

また、ノードが見つからない場合 (つまり、「-tagname- が見つかりません」) の文字列をカスタマイズしたいと考えています。

変数の長いリストをチェックする必要があり、コードを 100 回繰り返したくありません。

助言がありますか?

編集:

実際の xml ファイルの一部を次に示します。

<main>
 <asset name="Virtual Dvaered Unpresence">
  <virtual/>
  <presence>
   <faction>Dvaered</faction>
   <value>-1000.000000</value>
   <range>0</range>
  </presence>
 </asset>
 <asset name="Virtual Empire Small">
  <virtual/>
  <presence>
   <faction>Empire</faction>
   <value>100.000000</value>
   <range>2</range>
  </presence>
 </asset>
</main>

タグが存在するかどうかを確認し、存在する場合はコンテンツを取得したい。

編集編集:わかりました、2つの回答を組み合わせますが、投票できるのは1つだけです. ごめん。

編集 3: ここでの XPath に関する関連する質問: Python lxml (objectify): Xpath のトラブル

4

4 に答える 4

36

hasattr()これのために動作します:

if hasattr(root, 'elem1'):
    foo = root.elem1
于 2012-01-09T09:08:02.787 に答える
8

編集:サンプルファイルの回答を更新しました。

各アセットで特定のタグを検索する必要があると想定しています。もしそうなら、以下は私のために働いた:

import lxml.objectify

# Parse the file.
tree = lxml.objectify.parse('sample.xml')
root = tree.getroot()

# Which elements to find.
to_find = set(['presence/faction', 'presence/value', 'fake'])

# Go through each asset in the document.
for asset in root.findall('asset'):
    # Check for each element. 
    for name in to_find:
        node = asset.find(name)
        if node is not None:
            print 'Found %s, its value is %s' % (name, node)
        else:
            print 'Unable to find %s' % name

出力は次のとおりです。

Found presence/value, its value is -1000.0
Found presence/faction, its value is Dvaered
Unable to find fake
Found presence/value, its value is 100.0
Found presence/faction, its value is Empire
Unable to find fake
于 2011-03-22T02:03:35.240 に答える
7

elem2 の値を取得したいと仮定すると、xpath を使用してそれを見つけることができます。

tree = etree.parse(StringIO(htmlString), etree.HTMLParser()).getroot()
youWantValue = tree.xpath('/main/elem2')[0].text
于 2011-03-22T04:17:47.833 に答える
2

ドキュメントが比較的短い傾向にある場合は<main>、一連の変数名に一致するタグを探して、すべての子を反復処理できます。

tree = lxml.etree.fromstring(DATA)
NAMES = set(['elem1', 'elem3'])
for node in tree.iterchildren():
    if node.tag in NAMES:
        print 'found', node.tag

または、各変数名を一度に 1 つずつ検索できます。

for tag in ('elem1', 'elem3'):
    if tree.find(tag) is not None:
        print 'found', tag
于 2011-03-22T01:51:44.683 に答える