【问题标题】:How do I grab text of multiple tags in an xml feed using one xpath expression?如何使用一个 xpath 表达式在 xml 提要中获取多个标签的文本?
【发布时间】:2010-12-31 05:07:24
【问题描述】:

我正在尝试解析一个看起来像这样的 xml 提要:

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

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

有没有办法做到这一点?

编辑:

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

【问题讨论】:

  • “使提要中的每个项目都包含在其自己的数组中或以某种方式分组”是什么意思?请编辑您的问题并解释这一点——最好有一个完整的例子。

标签: xml xpath feed


【解决方案1】:

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

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

  • 节点集(无重复节点的无序集合)
  • 布尔值(真或假)
  • 数字(浮点数)
  • 字符串(UCS 字符序列)

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

【讨论】:

    【解决方案2】:

    有了这个输入

    <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
    

    我希望这会有所帮助..

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        您尚未指定语言,但如果您使用的是 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 元素没有“链接”子元素,则上述中断。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多