java - 获取子节点Java
问题描述
我有以下代码
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>
解决方案
好问题。有几种方法可以使用 Java 查询 XML 文档:
a) 将 XML 文档解析为 Document 并使用 getElementsByTagName 提取您需要的节点。这是您当前的方法。对于简单的文档是可以的,但它不能很好地扩展,因为 Document 类对文档的结构一无所知。getElementsByTagName() 方法必须假定它找到的任何标记都可能出现不止一次。但是你可以解决这个问题...
b) 为您的特定文档结构生成 Java 类。这要求您有一个描述 XML 结构的 XML模式。然后,您可以使用 JAXB 生成 Java 类来处理您的特定 XML 格式。在您的示例中,生成的代码将(从模式中)知道每个 FEATURE 标记中只有一个 NAME 和 VALUE 实例。NAME 和 VALUE 的 getter 方法将返回单个节点,因此您的代码不需要将数组用于单次出现的元素。有关更多详细信息,请参阅https://docs.oracle.com/javase/tutorial/jaxb/intro/index.html。
c) 使用 Java 内置的 XPath 支持来准确提取您需要的节点。XPath 专为处理 XML 文档而设计,非常强大和灵活。有关更多详细信息,请参阅如何在 Java 中使用 XPath 读取 XML。
选项 a) 几乎从未用于处理重要的 XML 文档。b) 和 c) 都很常见。
推荐阅读
- serverless-framework - 无服务器 API 网关日志记录
- css - CSS:在没有原始文本的表格单元格中选择子项
- elasticsearch - 为什么我的 ElasticSearch 搜索结果中出现了额外的关键字
- javascript - 如何有效地找到数组中所有先前索引加起来为给定整数 N 的数字的索引?
- html - SAFARI - 给子 div 高度:100% 采用视口高度而不是父高度
- javascript - 每当子组件呈现时,如何更改父组件的状态值?
- firefox - 在 Firefox 的 Input 元素中保持 type="Number" 时防止非数字值
- java - 如何从当前日期获取当前日期和接下来 30 天的日期
- plotly - Plotly 4.8,模板在应用时不添加图像布局
- sql - Distinct selection by one of values with a condition