Python 使用XPath选择另一个节点时,如何引用当前节点的子节点的值?(DDEX相关)

Python 使用XPath选择另一个节点时,如何引用当前节点的子节点的值?(DDEX相关),python,xml,xpath,ddex,Python,Xml,Xpath,Ddex,考虑这种XML结构,它是DDEX标准的简化版本: <doc> <master> <ResourceInfo> <Name>Foo</Name> <Seq>1</Seq> </ResourceInfo> <ResourceInfo> <Name>Bar</Name> <Seq>2</Seq> </ResourceI

考虑这种XML结构,它是DDEX标准的简化版本:

<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>
但前提是我知道每一首歌的名字,并且可以提前明确说明。我希望能够无声地映射它,并以某种方式将xpath中的“Foo”替换为当前曲目资源的名称
text()

这有点像将master中名称的
text()
上的曲目和资源与每个曲目中名称的
text()
连接起来。使用XPath有没有一种简单的方法


我试着迭代每一首曲目,并从曲目中提取Seq。因此,我不能明确要求“Foo”。我需要反省——“给我一个Seq,它是master中
节点的兄弟节点,其值与
中当前节点的
匹配。”

阅读您的评论后,我现在明白了您的意图。Uou可以简单地使用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>

我不确定我是否完全理解,但如果当前的上下文是:

/doc/track/Resource/Name
您可以使用以下XPath:

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

您应该获得相同
名称的
ResourceInfo
Seq

您的预期输出是什么?你到底想干什么?加入这些曲目在这里似乎不是很有帮助,可能还没有抓住要点。Jens,我正在尝试迭代每一首曲目,并从中提取Seq。因此,我不能明确要求“Foo”。我需要内省——“给我一个Seq,它是master中一个名称节点的同级节点,其值与中当前节点的名称匹配”。预期的输出是相同的(分别为1和2),但从编程角度讲,我不想要求“Foo”或“Bar”。我希望XPath在中插入“当前节点的名称”,以便XPath表达式在查找任何曲目的
时保持不变。是的,确实如此,但我不想显式地声明“Foo”。我想用“当前节点的子节点的文本”替换“Foo”。Daniel,我需要一些与Python兼容的东西。这看起来非常简单,非常棒,但它不适用于lxml或ElementTree。
/doc/track/Resource/Name
/doc/master/ResourceInfo[Name = current()]/Seq