#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