Skip to main content
 首页 » 编程设计

python之如何计算来自同一父节点的 XPath 中的 2 个不同节点集(兄弟节点)

2025年05月04日17虾米姐

如何使用 and 运算符 '|'计算2个节点集?换句话说,计算具有不同标签名称的 2 个 sibling 的数据。在这种情况下:我想要来自 edition 和 edition2 标签的数据。我试过了但它没有用。

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 的值 我设法使用联合运算符 |

做到了这一点
>>> 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() 

现在我们有 @src 和 text() 了吗?

请您参考如下方法:

使用

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()] 

关于问题更新

I also want img's @src too. How to do this with the self notation now that we have @src and text()?

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

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

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

或选择edition、edition2 和所有包含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 )