Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

find whether an element exists by a particular tag name in XML

I have an XML file where some sub tags (child node elements) are optional. e.g.

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

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

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

But when I read the XML files by tags, it throws a NullPointerException - since some sub-tags are optional (e.g. rest and pitch in above example). How can I filter this out? I couldn't come across any methods to find whether an element exists by a particular tag name. Even if I have a condition to check whether getElementsByTagName("tag-name") method not returns NULL - still it goes in the condition body and obviously throw the exception. How may I resolve this?

The java code is:

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();
}

Any insight or suggestions are appreciated. Thanks in advance.

like image 922
Dolphin Avatar asked Jul 08 '10 09:07

Dolphin


2 Answers

I had this very same problem (using getElementsByTagName() to get "optional" nodes in an XML file), so I can tell by experience how to solve it. It turns out that getElementsByTagName does not return null when no matching nodes are found; instead, it returns a NodeList object of zero length.

As you may guess, the right way to check if a node exists in an XML file before trying to fetch its contents would be something similar to:

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

Make sure to specify a "default" value in case the tag is never found.

like image 88
DanyAlejandro Avatar answered Oct 02 '22 19:10

DanyAlejandro


It may be that your NodeLists are not null, but are empty. Can you try changing your code like this and see what happens?

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

etc. (Doublecheck syntax etc., since I'm not in front of a compiler.)

like image 30
jwismar Avatar answered Oct 02 '22 20:10

jwismar