如何使用一个xpath表达式在xml提要中获取多个标记的文本?

时间:2010-12-31 05:07:25

标签: xml xpath feed

我正在尝试解析看起来像这样的xml Feed:

<item>
<title>item title</title>
<link>item link</link>
<description>item description</description>
</item>

我正在尝试找到一个xpath表达式,它将检索每个项目的所有详细信息,以便Feed中的每个项目都包含在自己的数组中或以某种方式分组。我尝试使用//item/*,但标签没有分组,尽管它们的排序正确。

有没有这样做?

编辑:

[
[title1, link1, desc1],
[title2, link2, desc2],
[title3, link3, desc3]
]

4 个答案:

答案 0 :(得分:0)

使用此输入

<root>
<item>
    <title>item title</title>
    <link>item link</link>
    <description>item description</description>
</item>
<item>
    <title>item2</title>
    <link>link2</link>
    <description>description2</description>
</item>
</root>

这个xsl

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

    <xsl:template match="//item">
        <xsl:value-of select="./title"/><xsl:text>
</xsl:text>
        <xsl:value-of select="./link"/><xsl:text>
</xsl:text>
        <xsl:value-of select="./description"/><xsl:text>
</xsl:text>
    </xsl:template>

</xsl:stylesheet>

你得到这个输出

item title
item link
item description

item2
link2
description2

我希望这有帮助..

答案 1 :(得分:0)

来自http://www.w3.org/TR/xpath/#section-Introduction

  

评估表达式以产生一个   对象,具有以下之一   四种基本类型:

     
      
  • node-set(没有重复的无序节点集合)
  •   
  • 布尔值(true或false)
  •   
  • 数字(浮点数)
  •   
  • string(一系列UCS字符)
  •   

所以,没有像元组那样的“结构”数据类型。您的任务的“标准”解决方案是选择父项并迭代它们以使用任何DOM API方法获取子项。

答案 2 :(得分:0)

这是一个返回序列的 XPath 2.0 表达式(假设来自Stefanos答案的XML输入文档):

for $item in /root/item
  return ($item/title/text(), $item/link/text(), $item/description/text())

序列是有序但不允许嵌套,因此您无法准确获得纯XPath要求的数据结构。使用XSLT(或其他主机语言),您可以创建提供所需结构的新对象。

答案 3 :(得分:0)

您尚未指定语言,但如果您使用的是Python(这就是您所呈现的数据结构),那么使用lxml就足够了:

 >>> from lxml import etree
 >>> d = etree.fromstring("""<doc>
 <item>
  <title>item 1 title</title>
  <link>item 1 link</link>
  <description>item 1 description</description>
 </item>
 <item>
  <title>item 2 title</title>
  <link>item 2 link</link>
  <description>item 2 description</description>
 </item>
</doc>""")
>>> [[e.xpath("title")[0].text,
      e.xpath("description")[0].text,
      e.xpath("link")[0].text]
     for e in d.xpath("/doc/item")]
[['item 1 title', 'item 1 description', 'item 1 link'], ['item 2 title', 'item 2 description', 'item 2 link']]

如果XML的结构不可靠,那么在列表解析中这不容易做到;例如,如果item元素没有“链接”子元素,则会出现上述情况。