Dom解析xml问题

时间:2015-06-23 07:09:58

标签: java xml parsing dom

我有一个简单的.xml文件,需要解析它。该文件如下:

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

我需要获取name, password, login, ext_uid的值才能创建数据库记录。

我为此做了什么: 创建了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));
  }

接下来我试图打印值:

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

我使用此功能是因为我试图了解如何获取值:childNode.getNodeValue()+" " + childNode.getNodeName() 但结果如下:

#text
null row

 #text

在第一种和第三种情况下,NodeValue是空的,在第二种情况下它是null,这意味着,我想根本没有NodeValue。 所以我的问题是如何获得name, password, login, ext_uid的价值?

3 个答案:

答案 0 :(得分:2)

childNode.getNodeValue()显然为null,因为它是一个空标记。你必须寻找属性

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

答案 1 :(得分:1)

if any(IPv4Address(unicoded) in ipaddress.IPv4Network(address) for address \ in ip4addressBlocks): 元素没有值,它只有属性。如果它有一个值,它看起来更像<row>

获取数据的一种方法是迭代XML节点属性,例如:

<row>this would be the value returned from getNodeValue()</row>

由于示例XML文件中的回车符(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()); } } 字符),代码的输出显示#text,根据规范,应保留该文件。示例输出中的\n是来自无值null元素的空节点值。

答案 2 :(得分:1)

改为使用XPath:

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