如何停止getNodeName()同时打印节点类型



我被难住了,希望我刚刚做了一件可以轻松修复的愚蠢事情。

我传递了一个充满XML的字符串,它是"XMLstring"。我想获取其中一个元素,并在控制台上以"name=value"的形式打印子节点。问题是控制台一直在打印垃圾和元素名称,我无法解决如何清除这些垃圾。

无论如何,这个代码:

try {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        InputSource is = new InputSource();
        is.setCharacterStream(new StringReader(XMLstring));
        Document doc = db.parse(is);
        NodeList nodes = doc.getElementsByTagName("client-details");
        Node node = nodes.item(0);
        NodeList client_details = node.getChildNodes();
        for (int i = 0; i < client_details.getLength(); i++) {
            System.out.println(client_details.item(i).getNodeName()+" = "+getTextContents(client_details.item(i)));
        }
    }
    catch (Exception e) {
        e.printStackTrace();
    }

给我以下信息:

#text = 
testing-mode = false
#text = 
name = testman
#text = 
age = 30

为什么要打印"#text="?我该如何摆脱它?

如果有帮助的话,我正在使用NetBeans。

您想使用getNodeValue():

System.out.println(client_details.item(i).getNodeValue()+" = "+getTextContents(client_details.item(i)));

如果您查看该页面顶部的表,您会发现对于Text节点,getNodeName()返回#Text。

我很想看看System.out.println()中的两个函数调用中的每一个都是分别打印出来的,只是因为整个输出应该在一行上。这两者中的一个导致了问题,我相信这可能是功能内部的问题。

否则,如果您使用String splitString = string.split("[=]");,它将根据delimeter"="拆分线路

然后你可以

    String splitString = string.split("[=]");
    System.out.println(splitString[1] + " = " + splitString[2]);

或者,更简单地说,对@Retrodone发布的进行一次小编辑

好吧,我为其他关心我的人解决了这个问题。代码的问题在于,在以这种方式从Node中获取标记名称之前,需要将Node强制转换为Element。因此:

try {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        InputSource is = new InputSource();
        is.setCharacterStream(new StringReader(XMLstring));
        Document doc = db.parse(is);
        NodeList nodes = doc.getElementsByTagName("client-details");
        Node node = nodes.item(0);
        NodeList client_details = node.getChildNodes();
        Element elementary;
        for (int i = 0; i < client_details.getLength(); i++) {
            if(client_details.item(i).getNodeType() == Node.ELEMENT_NODE) {
                elementary = (Element) client_details.item(i);
                System.out.println(elementary.getTagName()+" = "+getTextContents(client_details.item(i)));
            }
        }
    }

它产生了所需的结果,减去"#text"胡说八道:)

testing-mode = false
name = testman
age = 30

请注意,在调用getNodeName之前,我在for循环中添加了新的"if"语句,并将节点强制转换为元素,这对元素有效。

相关内容

  • 没有找到相关文章