libxml2 XPATH - 从XML中选择数据子集

时间:2010-10-12 08:58:05

标签: c++ c xml libxml2

我是XML dev的新手。我有一些关于使用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&gt; 1] / row [1] / name | / result [@count = 1] / row / name

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:0)

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

如果确实需要沿着单路径路径运行,那么您应该尝试使用允许您实时输入的xpath表达式,而不必重新编译C / C ++代码。您应该可以通过将XML加载到firefox并使用firebug来实现这一点 - 例如,在firebug控制台中键入$ x('// name')会产生三个节点。

但请注意,您的XML无效......您有一堆“&lt; row&gt;”应为“&lt; / row&gt;”和“&lt; resultset&gt;”相同你的计数需要

<result count="1">

即。带有引号的值。

答案 1 :(得分:0)

试试这个XPath -

<强> /resultset/result[@count=2]/row/name

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