найти, существует ли элемент по определенному имени тега в XML

У меня есть файл XML, в котором некоторые вложенные теги (элементы дочернего узла) являются необязательными. например

<part>
   <note>
       </rest>
   </note>

   <note>
       <pitch></pitch>
   </note>

   <note>
       <pitch></pitch>
   </note>
</part>

Но когда я читаю XML-файлы по тегам, возникает исключение NullPointerException, поскольку некоторые вложенные теги являются необязательными (например, rest и pitch в приведенном выше примере). Как я могу отфильтровать это? Я не мог найти какие-либо методы, чтобы узнать, существует ли элемент по определенному имени тега. Даже если у меня есть условие, чтобы проверить, не возвращает ли метод getElementsByTagName("tag-name") NULL - все равно он идет в теле условия и, очевидно, выдает исключение. Как я могу это решить?

Java-код:

if(fstelm_Note.getElementsByTagName("rest")!=null){
    if(fstelm_Note.getElementsByTagName("rest")==null){
        break;
    }
    NodeList restElmLst = fstelm_Note.getElementsByTagName("rest");
    Element restElm = (Element)restElmLst.item(0);
    NodeList rest = restElm.getChildNodes();

    String restVal = ((Node)rest.item(0)).getNodeValue().toString();

}else if(fstelm_Note.getElementsByTagName("note")!=null){
    if(fstelm_Note.getElementsByTagName("note")==null){
        break;
    }

    NodeList noteElmLst = fstelm_Note.getElementsByTagName("note");
    Element noteElm = (Element)noteElmLst.item(0);

    NodeList note = noteElm.getChildNodes();
    String noteVal = ((Node)note.item(0)).getNodeValue().toString();
}

Любое понимание или предложения приветствуются. Заранее спасибо.


person Dolphin    schedule 08.07.2010    source источник
comment
Мало информации. Опубликуйте код, в котором возникла проблема, и укажите, где выбрасывается NPE.   -  person Jim Garrison    schedule 08.07.2010


Ответы (5)


У меня была такая же проблема (с использованием getElementsByTagName() для получения «необязательных» узлов в файле XML), поэтому я могу по опыту сказать, как ее решить. Оказывается, getElementsByTagName не возвращает значение null, когда не найдено ни одного совпадающего узла; вместо этого он возвращает объект NodeList нулевой длины.

Как вы можете догадаться, правильный способ проверить, существует ли узел в файле XML, прежде чем пытаться получить его содержимое, будет примерно таким:

NodeList nl = element.getElementsByTagName("myTag");
if (nl.getLength() > 0) {
    value = nl.item(0).getTextContent();
}

Обязательно укажите значение «по умолчанию» на случай, если тег так и не будет найден.

person DanyAlejandro    schedule 04.11.2013

Возможно, ваши NodeLists не нулевые, а пустые. Можете ли вы попробовать изменить свой код таким образом и посмотреть, что произойдет?

NodeList restElmLst = fstelm_Note.getElementsByTagName("rest");
if (restElmLst != null && !restElmLst.isEmpty())
{
    Element restElm = (Element)rests.item(0);
...

и т. д. (Проверьте синтаксис и т. д., так как я не перед компилятором.)

person jwismar    schedule 10.07.2010

Ваши требования крайне неясны, но я, скорее всего, воспользуюсь javax.xml.xpath для анализа XML-документа с помощью Язык пути XML (XPath).

Посмотри на:

Но вы должны попытаться объяснить общую проблему, которую вы пытаетесь решить, а не конкретную проблему, с которой вы столкнулись. Но при этом 1. вы, вероятно, получите лучшие ответы и 2. текущий выбранный путь может быть не самым лучшим.

person Pascal Thivent    schedule 10.07.2010
comment
Привет Пасакаль, спасибо за ваши предложения. Является ли XPath веб-службой (которой для запуска кода требуется Интернет)? Могу ли я запросить XML-документ с помощью XPath? Это похоже на XQuery? У меня были некоторые проблемы с настройкой XQuery, поэтому я не мог это решить. Можете ли вы предложить несколько руководств, где я могу использовать XPath или XQuery? Спасибо за ваше время. - person Dolphin; 11.07.2010

Попробуйте что-то вроде ниже

bool hasCity = OrderXml.Elements("City").Any();

где OrderXml — родительский элемент.

person Kinjan Bhavsar    schedule 11.06.2015

Сначала вам нужно создать nodelist, а затем проверить длину nodelist, чтобы проверить, существует ли текущий элемент в строке xml.

NodeList restElmLst = fstelm_Note.getElementsByTagName("rest");

if (restElmLst.getLength() > 0) {
    String restVal = restElm.getElementsByTagName("rest").item(0).getTextContent(); 
}                               
person Sarojini2064130    schedule 03.08.2017