如何使用xpath Java检索子节点

时间:2018-07-13 08:26:58

标签: java xml xpath

我有一个如下所示的xml文件

 <Placemark>
    <name>west am</name>
    <styleUrl>#msn_ylw-pushpin0</styleUrl>
    <Polygon>
        <tessellate>1</tessellate>
        <outerBoundaryIs>
            <LinearRing>
                <coordinates>
                    -59.6227959506966,55.37494940456102,0            
                </coordinates>
            </LinearRing>
        </outerBoundaryIs>
    </Polygon>
</Placemark>
<Placemark>
    <name>east am</name>
    <styleUrl>#msn_ylw-pushpin10</styleUrl>
    <Polygon>
        <tessellate>1</tessellate>
        <outerBoundaryIs>
            <LinearRing>
                <coordinates>
                    -118.5321721528021,34.65735513563493,0                   
                </coordinates>
            </LinearRing>
        </outerBoundaryIs>`
    </Polygon>
</Placemark>

如何使用xpath检索标记值为“ east am”的标记。

感谢支持。

1 个答案:

答案 0 :(得分:0)

虽然您需要代码来读取和解析某些源中的xml以及用于管理和操作xml信息集的类,但是答案可以归结为以下XPath表达式:

//Placemark/name[./text()='east am']

此表达式选择...

  • name个元素,正在...
  • ... Placemark个元素的子元素...
  • ...文档中任何位置,...
  • ... name元素的文本内容为east am

替代

//Placemark/name[string(.)='east am']

有关string(.)./text()之间的区别的完整讨论,请参见this SO answer

基本上,一方面,如果xml节点的文本内容由多个文本节点表示,则./text()失败。相信这个决定是由解析器做出的,您无法指导这一选择。

另一方面,如果目标name节点是复杂类型,即。可能具有其自身文本内容的子元素,则需要从目标元素本身及其后代中指定文本片段的 all 的串联。

代码

此代码是一个独立的示例,用于从作为示例提供的xml文件中收集给定xpath表达式引用的节点的表示形式。

此代码起源于this SO answer,所有版权归其作者所有,不归我所有。

请注意,您的xml摘录不是有效的独立xml文件,因为它缺少单个根元素。如果文件中没有任何合成根,则将其添加到该文件中(xpath表达式将以两种方式起作用)。

文件名分别为xpath.javatest.51320827.xml。使用Java 1.8.0_45进行了测试;

//  https://stackoverflow.com/questions/51320827/how-can-i-retrieve-the-child-node-using-xpath-java
//
//  code taken from:    https://stackoverflow.com/a/47280397
//
//
import java.lang.*;
import java.io.*;
import javax.xml.*;
import javax.xml.parsers.*;
import javax.xml.xpath.*;
import org.w3c.dom.*;
import org.xml.sax.*;

public class xpath {
    public static void main(String[] args) {
        String xpathExpression = "//Placemark/name[./text()='east am']";

        // Read file
        Document doc = null;
        try {

            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            factory.setValidating(false);
            factory.setNamespaceAware(true);
            factory.setIgnoringComments(true);
            factory.setIgnoringElementContentWhitespace(true);

            DocumentBuilder builder = factory.newDocumentBuilder();
            File file = new File( "test.51320827.xml" );
            FileInputStream stream = new FileInputStream( file );
            doc = builder.parse( stream );
        } catch (SAXException | IOException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }

        // get from XPath
        try {
            XPathFactory xpf = XPathFactory.newInstance();
            XPath xpath = xpf.newXPath();

            XPathExpression compile = xpath.compile(xpathExpression);
            NodeList nodeList = (NodeList) compile.evaluate(doc, XPathConstants.NODESET);

            displayNodeList(nodeList);
        } catch (XPathExpressionException e) {
            e.printStackTrace();
        }

        System.out.println("\n===== ***** =====");
    }

    static void displayNodeList( NodeList nodeList ) {
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node node = nodeList.item(i);
            String NodeName = node.getNodeName();

            NodeList childNodes = node.getChildNodes();
            if ( childNodes.getLength() > 1 ) {
                for (int j = 0; j < childNodes.getLength(); j++) {

                    Node child = childNodes.item(j);
                    short nodeType = child.getNodeType();
                    if ( nodeType == 1 ) {
                        System.out.format( "\n\t Node Name:[%s], Text[%s] ", child.getNodeName(), child.getTextContent() );
                    }
                }
            } else {
                System.out.format( "\n Node Name:[%s], Text[%s] ", NodeName, node.getTextContent() );
            }

        }
    }
}