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