Nikitin Mikhail
Nikitin Mikhail

Reputation: 3019

Dom parsing xml problems

I have a simple .xml file and need to parse it. The file is the following:

<table name="agents">
   <row name="agent" password="pass" login="agent" ext_uid="133"/>
</table>

I need to get values of name, password, login, ext_uid to create a DB record.

What I have done for this: created an or.w3c.dom.Document:

public Document getDocument(String fileName){
        DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
        f.setValidating(false);
        DocumentBuilder builder  = f.newDocumentBuilder();              
        return builder.parse(new File(fileName));
  }

next I'm trying to print values:

document = getDocument(fileName);
            NodeList nodes = document.getChildNodes();
            for (int i=0; i<nodes.getLength(); i++){
                Node node = nodes.item(i);
                if(node.getNodeType() == Node.ELEMENT_NODE){
                    NodeList listofNodes = node.getChildNodes();
                    for(int j=0; j<listofNodes.getLength(); j++){
                        if(node.getNodeType() == Node.ELEMENT_NODE){
                            Node childNode = listofNodes.item(j);
                            System.out.println(childNode.getNodeValue()+" " + childNode.getNodeName());
                        }
                        }
                    }
                }

I use this because I'm trying to find out how to get values: childNode.getNodeValue()+" " + childNode.getNodeName() but the result is the following:

#text
null row

 #text

in the first and te third cases the NodeValue is empty and in the second case it is null, that means, I guess that there no NodeValue at all. So my question is how to get values of name, password, login, ext_uid?

Upvotes: 1

Views: 61

Answers (3)

forty-two
forty-two

Reputation: 12817

Use XPath instead:

    XPath xp = XPathFactory.newInstance().newXPath();

    System.out.println(xp.evaluate("/table/row/@name", doc));
    System.out.println(xp.evaluate("/table/row/@password", doc));
    System.out.println(xp.evaluate("/table/row/@login", doc));
    System.out.println(xp.evaluate("/table/row/@ext_uid", doc));

Upvotes: 1

andyb
andyb

Reputation: 43823

The <row> element has no value, it only has attributes. If it had a value it would look more like <row>this would be the value returned from getNodeValue()</row>.

One way to get the data is to iterate the XML node attributes, for example:

NamedNodeMap attrs = childNode.getAttributes();

if (attrs != null) {
    for (int k = 0; k < attrs.getLength(); k++) {
        System.out.println("Attribute: "
                + attrs.item(k).getNodeName() + " = "
                + attrs.item(k).getNodeValue());
    }
}

The output of your code is showing #text due to the carriage returns (\n characters) in the example XML file, which, according the specification, should be preserved. The null in the example output is the empty node value from the value-less <row> element.

Upvotes: 1

prash
prash

Reputation: 1016

childNode.getNodeValue() is obviously null as its an empty tag. You have to look for attributes

   Node childNode = listofNodes.item(j);

   Element e = (Element)childNode;
   String name = e.getAttribute("name");
   String password= e.getAttribute("password");
   String login= e.getAttribute("login");
   String ext_uid= e.getAttribute("ext_uid");

Upvotes: 2

Related Questions