如何选择不同级别的多个节点?

时间:2012-06-14 19:58:33

标签: xml xpath xml-parsing

拥有这个(简化的)XML:

<?xml version="1.0" encoding="UTF-8"?>
<kml>
<Document>
        <Placemark>
            <name>Poly 1</name>
            <Polygon>
                        <coordinates>
                            -58.40844625779582,-34.60295278618136,0
                        </coordinates>
            </Polygon>
        </Placemark>
        <Placemark>
            <name>Poly 2</name>
            <Polygon>
                        <coordinates>
                            -58.40414334150432,-34.59992445476809,0
                        </coordinates>
            </Polygon>
        </Placemark>
</Document>
</kml>

如何选择每个地标的名称和坐标? 现在我可以使用以下XPath表达式选择他们的名字:

//Document//Placemark//name

如何在没有任何其他数据的情况下选择两者?

3 个答案:

答案 0 :(得分:38)

您可以在XPath表达式中使用union。只需使用运算符:|

//Document/Placemark/name | //Document/Placemark/Polygon/coordinates

如果您不需要,请不要使用//后代轴)。使用//,这也可以://name | //coordinates。指定确切的路径在性能方面更好。

答案 1 :(得分:5)

使用

/*/*/Placemark/name | /*/*/Placemark/*/coordinates

这指定了两个单独的XPath表达式的结果的 union - 使用了标准的XPath联合运算符|。选定的是name元素的所有Placemark个元素,这些元素是XML文档顶部元素的孙子, plus 所有coordinates元素一个Placemark元素的孙子,它是XML文档顶层元素的孙。

所选元素按文档顺序排列(尽管没有规范的W3C文档指定顺序),这意味着在评估结果中(通常是XmlNodeList类型),任何name元素后面紧跟其对应的{ {1}}元素。

答案 2 :(得分:0)

已解决://地标/ * [自我::名称或后代::坐标]