我尝试使用java读取XML文件。问题是我不知道如何读取包含在另一个对象中的对象。这是一个例子。
<o1>
<id>123</id>
<name>abc</name>
<o2>
<o3>
<name>xyz</name>
<adr>somewhere</adr>
</o3>
<o3>
<name>mno</name>
<adr>anotherwhere</adr>
</o3>
</o2>
</o1>
我想将这些数据提取到我的java程序中。这是读取数据的示例,但它对于读取另一个内部的对象没有用。 代码来自this url。
File fXmlFile = new File("code.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
NodeList nList = doc.getElementsByTagName("o1");
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
}
}
答案 0 :(得分:0)
可以通过多种方式实现这一目标......
你可以......
SAX parser允许您处理已阅读的文档。当文档可能太大而无法在内存中维护时,这非常有用。
DOM parser生成(通常)文档的内存表示形式,您可以扫描,搜索并根据需要进行操作。
使用DOM模型,您可以从根节点开始,对所有子节点进行递归搜索,随时处理内容。这类似于SAX解析器的工作方式(概念上)
或者,如果您只是想搜索并挑选某些内容,可以使用XPath
,这样您就可以在文档中查询内容。
当您知道自己想要什么或者需要对文档执行重复搜索时,这非常有用,例如,基于您的示例code.xml
,以下内容......
try {
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File("code.xml"));
XPath xPath = XPathFactory.newInstance().newXPath();
XPathExpression exp = xPath.compile("//name");
NodeList nl = (NodeList) exp.evaluate(doc, XPathConstants.NODESET);
for (int index = 0; index < nl.getLength(); index++) {
Node node = nl.item(index);
Node parent = node.getParentNode();
System.out.println("Parent: " + parent.getNodeName());
System.out.println(" Name: " + node.getTextContent());
}
} catch (ParserConfigurationException | SAXException | IOException | XPathExpressionException ex) {
ex.printStackTrace();
}
将输出
Parent: o1
Name: abc
Parent: o3
Name: xyz
Parent: o3
Name: mno
有关详细信息,请查看How XPath Works和XPath Tutorial