提问人:Илья Величко 提问时间:11/8/2023 更新时间:11/9/2023 访问量:38
使用 DOM 解析 xml 时如何处理缺少标签?
How to handle missing tag when parsing xml using DOM?
问:
我正在尝试使用DOM进行XML解析,但问题是某些地方缺少标签。告诉我如何处理这种情况,以便在没有这种情况的情况下,将其他一些字符串写入 ArrayList(例如,“无数据”)?我是 Java 新手。我按照教程做了
类似内容的 XML:
<item>
<title>number 1</title>
</item>
<item>
<title>number 2</title>
<enclosure url="https://www.google.com/"/>
</item>
Java 代码的一部分:
List<String> title = new ArrayList<>();
List<String> enclosure = new ArrayList<>();
NodeList itemNodeList = document.getElementsByTagName("item");
for (int i = 0; i < itemNodeList.getLength(); i++){
if (itemNodeList.item(i).getNodeType() == Node.ELEMENT_NODE){
Element itemElement = (Element) itemNodeList.item(i);
NodeList childNodes = itemElement.getChildNodes();
for (int j = 0; j < childNodes.getLength(); j++){
if (childNodes.item(j).getNodeType() == Node.ELEMENT_NODE){
Element childElement = (Element) childNodes.item(j);
switch (childElement.getNodeName()){
case "title":{
title.add(childElement.getTextContent());
break;
}
case "enclosure":{
String info = childElement.getAttribute("url");
enclosure.add(info);
break;
}
}
}
}
}
}
答:
您正在将 XML 解析为 DOM 结构,因为您所需要的只是一个语法正确的 XML 文档。内部人士将谈论一份“格式良好”的文件。
现在,您希望强制只使用特定标记,并且可能希望强制它们以正确的数量或顺序出现。在这里,您需要定义哪些标签、出现的频率和顺序。 此类信息进入语法,该语法将在 XML 架构中定义。通过语法检查的文档称为有效文档。
W3C 对 XML Schema Part0: Primer 这个主题有一个很好的介绍。
如果您认为对于您的小示例来说,这太难处理了,则可以将验证放入您的应用程序中。在 DOM 树上,检查元素是否具有预期的子节点。或者检查它是否具有预期的属性。如果缺少默认值,则代码可能会使用默认值。 但是,如果您的文档变得越来越复杂,基于模式的方法会突然看起来更简单、更易于维护。
告诉我如何处理这种情况,以便在没有这种情况的情况下,将其他一些字符串写入 ArrayList(例如,“无数据”)?
如果您想要“title”和“enclosure”值的默认值,请按项目设置它们。例如
// ...
Element itemElement = (Element) itemNodeList.item(i);
String itemTitle = "No title";
String itemEnclosure = "no data";
// ...
然后,在分析子节点时适当地替换这些节点,而不是立即更新列表。例如
// ...
case "enclosure":{
itemEnclosure = childElement.getAttribute("url");
break;
}
// ...
在处理了每个项节点的所有子节点后,无论该信息是从子节点读取的还是保留默认值,都可以将其添加到列表中:
// ...
for (int j = 0; j < childNodes.getLength(); j++){
// ...
}
title.add(itemTitle);
enclosure.add(itemEnclosure);
// ...
但请注意,如果您的任何物品包含多个标题或多个附件,则其中一些将不会被捕获。如果您希望能够支持这样的倍数,那么您需要为数据提供不同的内部表示形式。
评论