我有一个如下所示的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”的标记。
感谢支持。
答案 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.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() );
}
}
}
}