如何在同一父代的XPath中计算2个不同的节点集(兄弟节点)?

时间:2012-06-21 19:54:56

标签: python xpath

如何使用和运算符'|'计算2个节点集?换句话说,计算具有不同标签名称的2个兄弟姐妹的数据。在这种情况下:我想要版本和版本2标签的数据。我试过'|它不起作用。

XML:

<?xml version="1.0" encoding="utf-8"?>
<wikimedia>
  <projects>
    <project name="Wikipedia" launch="2001-01-05">
      <editions>
        <edition language="English">en.wikipedia.org</edition>
        <edition language="German">de.wikipedia.org</edition>
        <edition language="French">fr.wikipedia.org</edition>
        <edition language="Polish">pl.wikipedia.org</edition>
        <edition language="Spanish">es.wikipedia.org</edition>
        <edition2 language="Spanglish">egs.wikipedia.org</edition2>
        <img src="hello.gif">hello</img>
      </editions>
    </project>
    <project name="Wiktionary" launch="2002-12-12">
      <editions>
        <edition language="English">en.wiktionary.org</edition>
        <edition language="French">fr.wiktionary.org</edition>
        <edition language="Vietnamese">vi.wiktionary.org</edition>
        <edition language="Turkish">tr.wiktionary.org</edition>
        <edition language="Spanish">es.wiktionary.org</edition>
        <edition2 language="Spanglish">egs.wiktionary.org</edition2>
        <img src="hello.gif">hello</img>
      </editions>
    </project>
  </projects>
</wikimedia>

Python:

>>> wikixml.xpath('//edition/text() | edition2/text()')
['en.wikipedia.org', 'de.wikipedia.org', 'fr.wikipedia.org', 'pl.wikipedia.org', 'es.wikipedia.org', 'en.wiktionary.org', 'fr.wiktionary.org', 'vi.wiktionary.org', 'tr.wiktionary.org', 'es.wiktionary.org']

修改

我在答案后得到了它,但我也想选择img/@src的值 我设法使用union运算符|

来完成此操作
>>> wikixml.xpath('//edition/text() | //edition2/text() | //img/@src')
['en.wikipedia.org', 'de.wikipedia.org', 'fr.wikipedia.org', 'pl.wikipedia.org', 'es.wikipedia.org', 'egs.wikipedia.org', 'hello.gif', 'en.wiktionary.org', 'fr.wiktionary.org', 'vi.wiktionary.org', 'tr.wiktionary.org', 'es.wiktionary.org', 'egs.wiktionary.org', 'hello.gif']

如何使用单个谓词和self表示法,如此处使用两个元素

/wikimedia/projects/project/editions/ *[self::edition or self::edition2]/text()

现在我们有@srctext()

2 个答案:

答案 0 :(得分:4)

使用

wikixml.xpath('//edition/text() | //edition2/text()')

或更有效率

wikixml.xpath('//*[self::edition or self::edition2]/text()]

甚至更好

wikixml.xpath('/wikimedia/projects/project/editions/*[self::edition or self::edition2]/text()]

关于问题更新

  

我也想要img的@src。现在如何使用自我符号来做到这一点   我们有@src和text()?

老实说,我不知道是否有办法使用上述表示法同时从元素轴和属性轴中进行选择。我对此表示怀疑。

您可以使用单个XPath,但放弃self :: notation(至少对于属性):

/wikimedia/projects/project/editions/ *[self::edition or self::edition2]
|
/wikimedia/projects/project/editions/img/@src

或选择editionedition2以及包含src属性的所有元素

/wikimedia/projects/project/editions/ *[self::edition or self::edition2 or attribute::src]

然后处理结果以获取src

的值

这与你在 XPath 1.0 中所做的一样多 根据Dimitre Novatchev的建议, XPath 2.0 允许你这样写:

/wikimedia/projects/project/editions/(*[self::edition or self::edition2] | img/@src )

答案 1 :(得分:2)

使用

   /*/*/project/editions/*[not(self::img)]
|
   /*/*/project/editions/img/@src

或在XPath 2.0中使用

/*/*/project/editions
               /(*[not(self::img)] | img/@src)