JAVA-如何在没有打开标签的情况下绕过封闭的XML标签

时间:2019-03-17 21:44:40

标签: java arrays xml string dom

我正在阅读以下XML文件:

在某些时候,我发现已关闭但未打开的标签,例如位置和大小。我的逻辑是将这些标签读取到数组中,并在某个时刻失败并

  

java.lang.ArrayIndexOutOfBoundsException

<deviceInfo>
    <device>TV2345</device>
    <deviceType>Television</deviceType>
    <location/>
    <size/>
</deviceInfo>

这是我的代码阅读并尝试对其进行转义,但是它不起作用:

Node nNode = nList.item(i);

if (nNode.getNodeType() == Node.ELEMENT_NODE) {
  Element eElement = (Element) nNode;

  String LocationNode=eElement.getElementsByTagName("location").item(0).getTextContent();

  if (LocationNode.length() > 0) {
    String DEVICEID = eElement.getElementsByTagName("deviceId").item(0).getTextContent();
    String[] LOCATION = eElement.getElementsByTagName("location").item(0).getTextContent().split("\\/");        
}

谢谢。

2 个答案:

答案 0 :(得分:0)

在示例xml中:

<deviceInfo>
    <device>TV2345</device>
    <deviceType>Television</deviceType>
    <location />
    <size />
</deviceInfo>

没有deviceId标签,但是您正试图从NodeList获取第一项:

eElement.getElementsByTagName("deviceId").item(0);

此操作失败,java.lang.ArrayIndexOutOfBoundsException

答案 1 :(得分:0)

您使用getElementsByTagName方法返回org.w3c.dom.NodeList对象。如果没有给定名称NodeList.getLength的元素,则方法返回0。因此,下面的代码可以安全地获取文本内容:

NodeList locations = document.getElementsByTagName("location");
if (locations.getLength() > 0) {
    String textContent = locations.item(0).getTextContent();
    System.out.println(textContent);
}

或者您可以创建执行此操作的方法:

public static String getFirstTextContent(Document node, String tagName) {
    NodeList locations = node.getElementsByTagName(tagName);
    if (locations.getLength() > 0) {
        return locations.item(0).getTextContent();
    }

    return "";
}

,您的代码可能如下所示:

String locationNode = getFirstTextContent(document, "location");

if (locationNode.length() > 0) {
    String DEVICEID = getFirstTextContent(document, "deviceId");
    String[] LOCATION = getFirstTextContent(document, "location").split("\\/");
}