JAVA — Как обойти закрытый XML-тег без открытого тега

#java #arrays #xml #string #dom

#java #массивы #xml #строка #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("\/");        
}
  

Спасибо.

Ответ №1:

Вы используете 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("\/");
}
  

Ответ №2:

В примере xml:

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

deviceId Тега нет, но вы пытаетесь получить первый элемент из NodeList :

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

И эта операция завершается с ошибкой java.lang.ArrayIndexOutOfBoundsException