我有以下XML:
<ConfigGroup Name="Replication">
<ValueInteger Name="ResponseTimeout">10</ValueInteger>
<ValueInteger Name="PingTimeout">2</ValueInteger>
<ValueInteger Name="ConnectionTimeout">10</ValueInteger>
<ConfigGroup Name="Pool">
<ConfigGroup Name="1">
<ValueString Encrypted="false" Name="Host">10.20.30.40</ValueString>
<ValueInteger Name="CacheReplicationPort">8899</ValueInteger>
<ValueInteger Name="RadiusPort">12050</ValueInteger>
<ValueInteger Name="OtherPort">4868</ValueInteger>
</ConfigGroup>
<ConfigGroup Name="2">
<ValueString Encrypted="false" Name="Host">10.20.30.50</ValueString>
<ValueInteger Name="CacheReplicationPort">8899</ValueInteger>
<ValueInteger Name="RadiusPort">12050</ValueInteger>
<ValueInteger Name="OtherPort">4868</ValueInteger>
</ConfigGroup>
</ConfigGroup>
</ConfigGroup>
我只是想知道什么是解析这个XML在Java中最简单的方法 - 我想从两个主机元件(例如10.20.30.40和10.20.30.50)的值。 注意可能有两个以上的池条目(或没有)。
我无法找到如何使用不同的XML解析器的Java一个简单的例子。
任何帮助深表感谢。
谢谢!
最简单的方法来搜索你所寻找的,是的XPath。
try {
//Load the XML File
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true);
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document configuration = builder.parse("configs.xml");
//Create an XPath expression
XPathFactory xpathFactory = XPathFactory.newInstance();
XPath xpath = xpathFactory.newXPath();
XPathExpression expr = xpath.compile("//ConfigGroup/ValueString[@Name='Host']/text()");
//Execute the XPath query
Object result = expr.evaluate(configuration, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
//Parse the results
for (int i = 0; i < nodes.getLength(); i++) {
System.out.println(nodes.item(i).getNodeValue());
}
} catch (ParserConfigurationException e) {
System.out.println("Bad parser configuration");
e.printStackTrace();
} catch (SAXException e) {
System.out.println("SAX error loading the file.");
e.printStackTrace();
} catch (XPathExpressionException e) {
System.out.println("Bad XPath Expression");
e.printStackTrace();
} catch (IOException e) {
System.out.println("IO Error reading the file.");
e.printStackTrace();
}
XPath表达式
"//ConfigGroup/ValueString[@Name='Host']/text()"
查找ConfigGroup元素在你的XML的任何地方,然后查找ConfigGroup元素中的valueString要素,即有值“host”的名称属性。 @名称=主机就像是与名称的valueString元素的过滤器。 和文本()结尾,则返回所选择的元素的文本节点中。
Java的API的XPath允许轻松地做到这一点。 以下XPath表达式
//ValueString[@Name='Host']
应该匹配你想要什么。 下面是如何使用API使用它:
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(yourXml.getBytes());
XPath xpath = XPathFactory.newInstance().newXPath();
NodeList nodeList = (NodeList) xpath.compile("//ValueString[@Name='Host']").evaluate(doc, XPathConstants.NODESET);
for (int i = 0; i < nodeList.getLength(); i++) {
String ip = ((Element) nodeList.item(i)).getTextContent();
// do something with your ip
}
File file = new File("some/path");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(file);
NodeList list = document.getElementsByTagName("name/of /your/ element");
// its return NodeList of all descendant Elements with a given tag name, in document order.
for (int i = 0; i < list .getLength(); i++) {
System.out.println(list.item(i).getNodeName()+" = "+list.item(i).getNodeValue());
}
你可以使用SAXON
String vs_source = "Z:/Code_JavaDOCX/1.xml";
Processor proc = new Processor(false);
net.sf.saxon.s9api.DocumentBuilder builder = proc.newDocumentBuilder();
XPathCompiler xpc = proc.newXPathCompiler();
try{
XPathSelector selector = xpc.compile("//output").load();
selector.setContextItem(builder.build(new File(vs_source)));
for (XdmItem item: selector)
{
System.out.println(item.getStringValue());
}
}
catch(Exception e)
{
e.printStackTrace();
}