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

3

我被难住了,希望只是我犯了一个容易修复的愚蠢错误。

我正在传递一个包含XML的字符串,名为“XMLstring”。我想要获取其中一个元素并将其子节点以“名称=值”的形式打印到控制台上。问题在于,控制台一直打印出垃圾信息和元素名称,而我无法弄清楚如何摆脱它们。

无论如何,这段代码:

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,该怎么办?

我不认为你能够做到,我已经尝试过了,遇到了同样的问题。 - RMT
3个回答

6
您需要使用getNodeValue():
System.out.println(client_details.item(i).getNodeValue()+" = "+getTextContents(client_details.item(i)));

如果您查看此页面顶部的表格,您会发现对于文本节点,getNodeName()返回#text。请参考此链接

但是getNodeValue()仍然会输出该行,只不过它是一个带有“=”符号的空白行,现在元素名称已被替换为null :( - Evernoob
@retrodrone,您提供的链接已失效。 - javaPlease42

1

我很想看看你的System.out.println()中的每个函数调用分别打印出什么,因为整个输出应该在一行上。其中一个可能会导致问题,我相信它可能是函数内部引起的。

否则,如果您使用String splitString = string.split("[=]");,它将根据分隔符“=”拆分该行。

然后你就可以:

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

或者,更简单地说,进行@retrodrone发布的那个小修改


1

好的,我成功解决了这个问题,对于其他关心此事的人来说。代码的问题在于,在以这种方式获取标记名称之前,需要将节点转换为元素。因此:

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

请注意我在for循环内添加的新“if”语句以及在调用getNodeName之前将节点转换为元素的强制转换,这对于元素是有效的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接