найти, существует ли элемент по определенному имени тега в XML - PullRequest
4 голосов
/ 08 июля 2010

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

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

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

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

Но когда я читаю XML-файлы по тегам, он выдает исключение NullPointerException - поскольку некоторые вложенные теги являются необязательными (например, rest и pitch в приведенном выше примере)Как я могу отфильтровать это?Я не мог найти какие-либо методы, чтобы найти, существует ли элемент по определенному имени тега.Даже если у меня есть условие, чтобы проверить, не возвращает ли метод getElementsByTagName ("имя-тега") значение 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();
}

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

Ответы [ 5 ]

11 голосов
/ 04 ноября 2013

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

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

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

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

1 голос
/ 10 июля 2010

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

Посмотрите:

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

0 голосов
/ 03 августа 2017

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

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

if (restElmLst.getLength() > 0) {
    String restVal = restElm.getElementsByTagName("rest").item(0).getTextContent(); 
}                               
0 голосов
/ 11 июня 2015

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

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

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

0 голосов
/ 10 июля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...