如何使用XPathJava检索子节点

如何使用XPathJava检索子节点,java,xml,xpath,Java,Xml,Xpath,我有一个如下所示的xml文件 <Placemark> <name>west am</name> <styleUrl>#msn_ylw-pushpin0</styleUrl> <Polygon> <tessellate>1</tessellate> <outerBoundaryIs> <LinearRin

我有一个如下所示的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>

西汉姆
#msn_ylw-pushpin0
1.
-59.6227959506966,55.37494940456102,0            
东阿姆
#msn_ylw-pushpin10
1.
-118.5321721528021,34.65735513563493,0                   
`
如何使用xpath检索标记值为“east am”的标记


感谢您的支持。

虽然您需要从一些源代码和类中读取和解析xml以管理和操作xml信息集,但答案归结为以下XPath表达式:

//Placemark/name[./text()='east am']
此表达式选择

  • 名称
    元素,是
  • 。。。
    Placemark
    元素的子元素
  • 。。。文件中的任何地方
  • 。。。
    name
    元素的文本内容为
    east am
备选方案

//Placemark/name[string(.)='east am']
有关
字符串(.)
/text()
之间区别的完整讨论,请参阅

基本上,一方面,如果用多个文本节点表示xml节点的文本内容,
/text()
将失败。假设这个决定是由解析器做出的,您没有办法指导这个选择

另一方面,如果目标
name
节点属于复杂类型,即可能具有具有自己文本内容的子元素,则需要指定来自目标元素本身及其子元素的所有文本片段的串联

代码

//Placemark/name[string(.)='east am']
这段代码是一个独立的示例,用于从作为示例提供的xml文件中收集由给定xpath表达式引用的节点的表示形式

此代码源于,所有学分均归其作者所有,无任何学分归我所有

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

文件名为
xpath.java
test.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() );
            }

        }
    }
}
//https://stackoverflow.com/questions/51320827/how-can-i-retrieve-the-child-node-using-xpath-java
//
//代码取自:https://stackoverflow.com/a/47280397
//
//
导入java.lang.*;
导入java.io.*;
导入javax.xml.*;
导入javax.xml.parsers.*;
导入javax.xml.xpath.*;
导入org.w3c.dom.*;
导入org.xml.sax.*;
公共类xpath{
公共静态void main(字符串[]args){
字符串xpathExpression=“//Placemark/name[./text()='east am']”;
//读取文件
单据单据=空;
试一试{
DocumentBuilderFactory工厂=DocumentBuilderFactory.newInstance();
工厂设置验证(假);
factory.setNamespaceAware(true);
factory.setIgnoringComments(true);
setIgnoringElementContentWhitespace(true);
DocumentBuilder=factory.newDocumentBuilder();
File File=新文件(“test.51320827.xml”);
FileInputStream=新的FileInputStream(文件);
doc=builder.parse(流);
}捕获(SAXException | IOE异常){
e、 printStackTrace();
}捕获(ParserConfiguration异常e){
e、 printStackTrace();
}
//从XPath获取
试一试{
XPathFactory xpf=XPathFactory.newInstance();
XPath=xpf.newXPath();
XPathExpression compile=xpath.compile(XPathExpression);
NodeList NodeList=(NodeList)compile.evaluate(doc,XPathConstants.NODESET);
显示节点列表(nodeList);
}捕获(XPathExpressionException e){
e、 printStackTrace();
}
System.out.println(“\n====*****==”);
}
静态无效显示节点列表(节点列表节点列表){
for(int i=0;i1){
对于(int j=0;j
这可能是XPath的基础。你试过什么吗?分享您的XPath并描述您的问题