【问题标题】:libxml2 XPATH - Selecting subset of data from XMLlibxml2 XPATH - 从 XML 中选择数据子集
【发布时间】:2010-10-12 08:58:04
【问题描述】:

我是 XML 开发的新手。我有一些关于使用 XPATH 和 libxml 解析 XML 的问题。

我的 XML 结构如下:

<resultset>
        <result count=1>
           <row>
               <name> He-Man! </name> 
               <home> Greyskull </home>
           <row>
        </result>
        <result count=2>
           <row>
               <name> Spider-Man</name> 
               <home> Some downtown apartment </home>
           <row>
           <row>
               <name> Disco-Man!</name> 
               <home> The 70's dance floor </home>
           <row>
        </result>
<resultset>

我需要从这个 XML 中挑选名称,但是如果计数是 2,我只需要从第一条记录中获取它。我浏览了一些教程,但我无法提出可以用于此目的的 XPATH 查询。

/name 将选择所有名称元素。

/result[@count > 1]/row[1]/name | /result[@count =1]/row/name

这可以用 XPATH 完成吗?是通过 XPATH 还是通过遍历 XML 树更好?

有人可以指出我通过 XML 进行一些复杂的搜索吗?

编辑:实际场景需要选择 XML 行的一个子集,它们有时嵌套在 2 个级别。这听起来像我需要 OR '|'选择我需要的节点的许多路径......我不确定这是否比走一棵树更有效......上面是为了复制问题而输入的:)

谢谢!

【问题讨论】:

  • Xpath 正在遍历 XML 树。
  • 也许我误解了这个问题,或者您的示例被简化了很多,但 /result/row[1]/name 在您的示例中不起作用吗?

标签: c++ c xml libxml2


【解决方案1】:

试试这个 XPath -

/resultset/result[@count=2]/row/name

这将给出属于此 XPath 的所有节点的列表。从这里只取第一个元素(因为您只需要第一条记录)。

【讨论】:

  • +1 好答案。你写道:从这里只取第一个元素。在 XPath 中,这将是:(/resultset/result[@count=2]/row/name)[1].
  • @alejandro。是的,这就是你为获得第一个元素所做的事情。还尽可能尝试在 XPaths 中使用绝对路径。这样你就一定会得到你想要的,而不是选择一些虚假的节点。
  • 关于一些虚假节点被选中,这是因为轴的优先级高于谓词,并且位置谓词遵循轴方向。这就是为什么我用 take the first 表达式来完成你的回答
  • 从概念上讲,是的.. 我不确定 libxml2 的实现实际上是如何做到的,如果我必须选择在层次结构中处于不同级别的元素(选择性元素),我会假设我将不得不“|”多条路径。我不确定这将如何执行。也不清楚如何处理 xml 中丢失的节点(如果有的话是由于源上的错误处理)......无论如何......我选择了手动行走路径来解决我的问题,因为它提供了更大的灵活性。谢谢movieyoda,亚历杭德罗..
【解决方案2】:

我可能会让我的 xpath 更简单,只提取两种情况,然后遍历两个节点集。

如果您确实需要使用单一的 xpath 路径,您应该尝试您的 xpath 表达式,以便您可以实时输入它们,而不必重新编译 C/C++ 代码。您应该能够通过将 XML 加载到 firefox 并使用 firebug 来做到这一点 - 例如,在 firebug 控制台中键入 $x('//name') 会给出三个节点。

但请注意,您的 XML 无效...您有一堆“”,应该是“”,对于“”也是如此,您的计数需要是

<result count="1">

即在值周围加上引号。

【讨论】:

  • 谢谢,我刚刚输入了我要解析的版本的简化版本 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
相关资源
最近更新 更多