【问题标题】:How to get a list of concatenated text nodes如何获取连接文本节点的列表
【发布时间】:2010-11-25 01:34:27
【问题描述】:

我的目的是请求一个 xml 结构,仅使用一个 XPath 评估,以获得包含每个“my_class”div 的 text3 和 text5 连接的字符串列表。

结构示例如下:

 <div>   
     <div>
         <div class="my_class">
             <div class="my_class_1"></div>
             <div class="my_class_2">text2</div>
             <div class="my_class_3">
                 text3
                 <div class="my_class_4">text4</div>
                 <div class="my_class_5">text5</div>
             </div>
         </div>
         <div class="my_class_6"></div>   
     </div>   
     <div>
         <div class="my_class">
             <div class="my_class_1"></div>
             <div class="my_class_2">text12</div>
             <div class="my_class_3">
                 text13
                 <div class="my_class_4">text14</div>
                 <div class="my_class_5">text15</div>
             </div>
         </div>   
     </div>  
 </div>

这意味着我想得到这个结果列表:
- 在索引 0 => text3 text5
- 在索引 1 => text13 text15

我目前只能获取 my_class 节点,但带有我要排除的 text12 ;或每个字符串的列表,未连接。

我该如何继续?

提前感谢您的帮助。

编辑:在我的示例中,我从搜索中删除了 text4 和 text14

【问题讨论】:

    标签: xpath


    【解决方案1】:

    编辑:现在问题变了……

    XPath 1.0:没有 “字符串列表” 数据类型之类的东西。你可以使用这个表达式来选择你想要的文本节点的所有容器元素:

    /div/div/div[@class='my_class']/div[@class='my_class_3']
    

    然后使用您的宿主语言的正确 DOM 方法获取 每个选定元素的 字符串值(所有后代文本节点的串联) 后代文本您想要的节点并将它们的字符串值与适当的相对 XPath 或 DOM 方法连接起来:

    text()[1]|div[@class='my_class_5']
    

    XPath 2.0:有序列数据类型。

    /div/div/div[@class='my_class']
               /div[@class='my_class_3']
                  /concat(text()[1],div[@class='my_class_5'])
    

    【讨论】:

    • 这是否意味着不可能在兄弟节点中获取多个文本内容,除了其中一个,只能在一个响应中?
    • @carpediem:XPath 选择节点。您可以选择所有您想要的文本节点,但您的结果将是一个节点集(而不是它们之间的“连接”关系)。我的路径选择每个容器您想要的文本节点,而不仅仅是一个。
    • @Alejandro & @Paul:好的。经过几次测试,这行得通。我已经尝试过这个功能,但我的错误最终是关于如何检索结果集。在这种情况下,我不得不改变演员阵容。谢谢大家的帮助
    • @carpediem:你很高兴。
    • @Alejandro:谢谢。如此迅速地获得准确性帮助真是太好了:)
    【解决方案2】:

    你能不能只使用:

    //my_class/my_class_3 
    

    然后从中获取 .innerText ?可能需要进行一些间距清理,但它应该包含所有内部文本(包括来自第 4 类和第 5 类的文本)但没有标签。


    编辑:澄清后

    concat(/div/div/div[@class=my_class]/div[@class=my_class_3]/text(), ' ', /div/div/div[@class=my_class]/div[@class=my_class_5]/text())
    

    这可能行得通

    【讨论】:

    • 是的。你是绝对正确的。我尝试了一些时间来构建我的示例,但我意识到它与我的问题并不完全匹配。事实上,我真正的问题是在没有 text4 和 text14 的情况下获取这个标签的内容(my_class3)。我将对其进行准确的修改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多