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

2024-04-27 02:53:16 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑这个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>

我想选择<master>中的ResourceInfo节点,其子节点<Name>与每个track节点的名称的文本值匹配,以获得Seq编号。你知道吗

我可以通过获取每个曲目的lxml树并显式请求<ResourceInfo>来直接实现这一点,如下所示:

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

但前提是我知道每首歌的名字,并且可以提前明确地说出来。我希望能够无声地映射它,并以某种方式将xpath中的“Foo”替换为对当前曲目资源的名称text()的引用。你知道吗

这有点像将master中名称的text()上的轨迹和资源与每个轨迹中名称的text()连接起来。使用XPath有没有一种简单的方法?你知道吗

我试着迭代每个轨迹,并从轨迹中提取Seq。因此,我不能明确要求“Foo”。我需要反省-“给我Seq,它是master中的<Name>节点的同级,其值与<track>中当前节点的<Name>匹配”。你知道吗


Tags: textnamemaster名称doc节点foo轨迹
2条回答

看完你的评论,我现在明白你的意思了。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>

你的代码工作:

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

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

/doc/track/Resource/Name

使用以下XPath:

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

您应该得到相同NameResourceInfoSeq。你知道吗

相关问题 更多 >