我有以下代码
try {
String xml = "<ADDITIONALIDENT><FEATURE MID=\"TEST\"><NAME>ONE NAME</NAME><VALUE>ONE VALUE</VALUE></FEATURE><FEATURE MID=\"TEST\"><NAME>TWO NAME</NAME><VALUE>TWO VALUE</VALUE></FEATURE><FEATURE MID=\"TEST\"><NAME>THREE NAME</NAME><VALUE>THREE VALUE</VALUE></FEATURE><FEATURE MID=\"TEST\"><NAME>FOUR NAME</NAME><VALUE>FOUR VALUE</VALUE></FEATURE><FEATURE MID=\"TEST\"><NAME>FIVE NAME</NAME><VALUE>FIVE VALUE</VALUE></FEATURE></ADDITIONALIDENT>";
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
dbFactory.setNamespaceAware(true);
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document document = dBuilder.newDocument();
document = dBuilder.parse(new InputSource(new StringReader(xml)));
NodeList featureList = document.getElementsByTagName("FEATURE");
for (int i = 0; i < featureList.getLength(); i++) {
Element featureElement = (Element) featureList.item(i);
NodeList nameList = featureElement.getElementsByTagName("NAME");
NodeList valueList = featureElement.getElementsByTagName("VALUE");
System.out.println("THIS IS NAME: " + nameList.item(0).getTextContent());
System.out.println("THIS IS VALUE: " + valueList.item(0).getTextContent());
}
} catch (Exception e) {
e.printStackTrace();
}
它工作得很好,而且它能找到正确的值,但我认为我的方法不对。我觉得我不应该在实际的featureList元素中使用列表。
有没有一种方法可以在不做两个列表的情况下得到值?
<ADDITIONALIDENT>
<FEATURE MID="TEST">
<NAME>ONE NAME</NAME>
<VALUE>ONE VALUE</VALUE>
</FEATURE>
<FEATURE MID="TEST">
<NAME>TWO NAME</NAME>
<VALUE>TWO VALUE</VALUE>
</FEATURE>
<ADDITIONALIDENT>
用下面的方法试试。
try {
String xml = "YOUR_XML_CONTEN";
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
dbFactory.setNamespaceAware(true);
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document document = dBuilder.newDocument();
document = dBuilder.parse(new InputSource(new StringReader(xml)));
NodeList featureList = document.getElementsByTagName("FEATURE");
for (int i = 0; i < featureList.getLength(); i++) {
Element featureElement = (Element) featureList.item(i);
System.out.println("THIS IS NAME: " +
featureElement.getElementsByTagName("NAME").item(0).getTextContent());
System.out.println("THIS IS VALUE: " +
featureElement.getElementsByTagName("VALUE").item(0).getTextContent());
}
} catch (Exception e) {
e.printStackTrace();
}
输出。
THIS IS NAME: ONE NAME
THIS IS VALUE: ONE VALUE
THIS IS NAME: TWO NAME
THIS IS VALUE: TWO VALUE
THIS IS NAME: THREE NAME
THIS IS VALUE: THREE VALUE
THIS IS NAME: FOUR NAME
THIS IS VALUE: FOUR VALUE
THIS IS NAME: FIVE NAME
THIS IS VALUE: FIVE VALUE
好问题。使用Java查询XML文档有几种方法。
a) 把XML文档解析成Document,然后用getElementsByTagName提取你需要的节点。这是你目前的方法。对于简单的文档来说是可以的,但是它的扩展性不好,因为Document类对文档的结构一无所知。getElementsByTagName()方法必须假设它找到的任何标记都是 "标签"。可能 但你可以解决这个问题......。
b) 为你的特定文档结构生成Java类。这需要你有一个XML模式来描述你的文档结构。你的 XML。然后,您可以使用JAXB生成Java类来处理您特定的XML格式。在您的例子中,生成的代码将是 知道 (来自模式),每个FEATURE标签中正好有一个NAME和VALUE的实例。NAME和VALUE的getter方法将返回一个单一的Node,因此您的代码不需要为单次出现的元素使用数组。https:/docs.oracle.comjavasetutorialjaxbintroindex.html。 了解更多细节。
c) 使用Java中内置的XPath支持来准确地提取你所需要的节点,XPath是为处理XML文档而设计的,非常强大和灵活。XPath是为处理XML文档而设计的,它非常强大和灵活。如何在Java中使用XPath读取XML 以了解更多细节。
选项a)几乎不用于处理非平凡的XML文档。b)和c)都很常见。