【问题标题】:getNodeName() not getting Node NamegetNodeName() 没有得到节点名称
【发布时间】:2014-05-06 04:41:13
【问题描述】:

我正在使用 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

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

【问题讨论】:

  • 您是否也尝试打印父节点名称? AFAIK 两个标签之间的文本也是一个节点,即&lt;Name&gt;adil&lt;/Name&gt; 将是两个节点:Nametext(一个未命名的文本节点)。我的意思是:而不是nod.getFirstChild().getNodeName() 尝试nod.getNodeName()
  • @Thomas:谢谢它的工作

标签: java android xpath xml-parsing


【解决方案1】:

试试这个功能

     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;

            }

【讨论】:

    【解决方案2】:

    您正在遍历节点列表

    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()  + ...)
    

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      • 2012-09-30
      • 2013-11-27
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      相关资源
      最近更新 更多