简体   繁体   中英

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 ?

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");

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.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM