getNodeName()没有获取节点名称

时间:2014-03-27 09:45:44

标签: java android xpath xml-parsing

我使用XPath从xml获取节点的名称和值,但我正在尝试的代码没有得到我的节点名称... 这是我正在解析的xml

<?xml version="1.0" encoding="UTF-8"?>
  <reg>
  <user>
    <Name>adil</Name>
    <Email>adil@gmail.com</Email>
    <Picture>/storage/sdcard0/DCIM/browser-photos/1352975129941.jpg</Picture>
    <LastEdited>26 Mar 2014 11:49:39</LastEdited>
  </user>
<user>
<Name>zeeshan</Name>
<Email>zajmal@gmail.con</Email>
<Picture>/storage/sdcard0/DCIM/browser-photos/1352975129941.jpg</Picture>
<LastEdited>26 Mar 2014 11:49:39</LastEdited>
</user>
</reg>

这是我正在尝试的代码

XPath xPath =  XPathFactory.newInstance().newXPath();
    String expression = "//Email[text()='"adil@gmail.com"']";
    System.out.println(expression);
    Node node = (Node) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODE);
        if(null != node) {
        Node pNode = node.getParentNode();
        nodeList = pNode.getChildNodes();
        for (int i = 0;null!=nodeList && i < nodeList.getLength(); i++) {
        Node nod = nodeList.item(i);
        if(nod.getNodeType() == Node.ELEMENT_NODE)
               {         
System.out.println(nod.getFirstChild().getNodeName().toString() + " : " + nod.getFirstChild().getNodeValue()); 
}

system.out.println()的输出是

#text : adil
#text : adil@gmail.com 
#text : /storage/emulated/0/DCIM/browser-photos/1352975129941.jpg
#text : 26 Mar 2014 11:49:39

我无法选择我错的地方......

2 个答案:

答案 0 :(得分:0)

尝试此功能

     public List<List<String>> Parseyourxmls(String xml) {

                List<List<String>> ll = new ArrayList<List<String>>();
                try {
                    DocumentBuilderFactory dbFactory = DocumentBuilderFactory
                            .newInstance();
                    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                    InputStream is = new ByteArrayInputStream(xml.getBytes("UTF-8"));
                    Document doc = dBuilder.parse(is);
                    doc.getDocumentElement().normalize();

                    NodeList nList = doc.getElementsByTagName("OrderDetails");

                    if (nList.getLength() > 0) {
                        Node nNode = nList.item(0);
                        for (int i = 0; i < nList.getLength(); i++) {

                            nNode = nList.item(i);

                            System.out.println("\nCurrent Element :"
                                    + nNode.getNodeName());

                            if (nNode.getNodeType() == Node.ELEMENT_NODE) {

                                Element eElement = (Element) nNode;
                                List<String> l = new ArrayList<String>();
                                l.add(0, eElement.getElementsByTagName("Name")
                                        .item(0).getTextContent());
                                l.add(1, eElement.getElementsByTagName("Email")
                                        .item(0).getTextContent());
/*all other */
                                ll.add(l);
                            }

                        }
                        return ll;
                    }

                } catch (Exception e) {
                    Log.e("11111", e.toString());
                }
                return ll;

            }

答案 1 :(得分:0)

您正在使用

遍历节点列表
for (int i = 0; null != nodeList && i < nodeList.getLength(); i++) {
    Node nod = nodeList.item(i);
    // ...
}

每次通过nodeList.item(i)调用获取用户节点的当前子节点时,首先是名称节点,然后是电子邮件节点,依此类推。但是你打印出来了

System.out.println(nod.getFirstChild().getNodeName().toString()  + ...)

在这里,您正在检索当前节点的第一个子节点。名称节点的第一个子节点是包含内容的文本节点。所有其他节点也是如此。文本节点没有可识别的名称。 &#34; #text&#34;输出只是告诉你,这是一个文本节点。

你想要的是打印出节点的名称。像那样:

System.out.println(nod.getNodeName().toString()  + ...)