1

DDEX 標準の単純化されたバージョンである、次の XML 構造について考えてみましょう。

<doc>
<master>
 <ResourceInfo>
  <Name>Foo</Name>
  <Seq>1</Seq>
 </ResourceInfo>
 <ResourceInfo>
  <Name>Bar</Name>
  <Seq>2</Seq>
 </ResourceInfo>
</master>
<track>
 <Resource>
  <Name>Foo</Name>
 </Resource>
</track>
<track>
 <Resource>
  <Name>Bar</Name>
 </Resource>
</track>
</doc>

<master>各トラック ノードの Name のテキスト値に一致する子を持つResourceInfo ノードを選択し<Name>て、Seq 番号を取得したいと思います。

各トラックの lxml ツリーを取得し、次<ResourceInfo>のように明示的にリクエストすることで、直接行うことができます。

track.xpath('/doc/master/ResourceInfo/Seq[../Name[text()="Foo"]]')

しかし、それは私が各トラックの名前を知っていて、事前に明示的に述べることができることを前提としています. これをばかげてマップし、xpath の「Foo」text()を現在のトラックのリソースの名前への参照に置き換えることができるようにしたいと考えています。

text()これは、master の Name のトラックとリソースtext()を各トラックの Name に結合するようなものです。XPathでこれを行う簡単な方法はありますか?

各トラックを反復処理し、トラックから Seq を取得しようとしています。したがって、「Foo」を明示的に要求することはできません。私は内省する必要があります - 「現在のノードと<Name>一致する値を持つマスターのノードの兄弟である Seq を教えてください」.<Name><track>

4

2 に答える 2

2

完全に理解しているかどうかはわかりませんが、現在のコンテキストが次の場合:

/doc/track/Resource/Name

また、次の XPath を使用します。

/doc/master/ResourceInfo[Name = current()]/Seq

同じSeqのを取得する必要があります。ResourceInfoName

于 2013-02-16T03:24:30.210 に答える
1

あなたのコメントを読んだ後、私はあなたが何を求めているのか理解しました。うーん、単純に Python を使用して結合を行うことができます。

from lxml import etree

doc = etree.parse('sample.xml')

# gather resources
resources = {}
for element in doc.xpath('/doc/master/ResourceInfo'):
    name = element[0].text
    seq  = element[1].text
    resources[name] = seq

# gather tracks
tracks = []
for element in doc.xpath('/doc/track/Resource/Name'):
    name = element.text
    tracks.append(name)

# join:

for track in tracks:
    print 'Track: %s, seq: %s' % (track, resources.get(track))

# returns: 
# Track: Foo, seq: 1
# Track: Bar, seq: 2

前の回答:

XML の形式が正しくありません:

<doc>
  <master>
    <ResourceInfo>
      <Name>Foo</Name>
      <Seq>1</Seq>
    </ResourceInfo>
    <ResourceInfo>
      <Name>Bar</Name>
      <Seq>2</Seq>
    </ResourceInfo>
  </master>
  <track>
    <Resource>
      <Name>Foo</Name>
    </Resource>
  </track>  <!-- was missing backslash -->
  <track>
    <Resource>
      <Name>Bar</Name>
    </Resource>
  </track>
</doc>

あなたのコードは動作します:

from lxml import etree

doc = etree.parse('a.xml')

for element in doc.xpath('/doc/master/ResourceInfo/Seq[../Name[text()="Foo"]]'):
    #print etree.tostring(element)
    print element.text  

# returns
# 1
于 2013-02-16T00:21:55.253 に答える