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

时间:2011-06-02 16:49:59

标签: java xml netbeans

我很难过,希望我刚刚做了一件我可以轻松解决的蠢事。

我传入一个充满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。

3 个答案:

答案 0 :(得分:6)

您想要使用getNodeValue():

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

如果查看in the table at the top of this page,您会看到对于Text节点,getNodeName()返回#text。

答案 1 :(得分:1)

我很想知道System.out.println()中的两个函数调用中的每一个是分别打印出来的,只是因为整个输出应该在一行上。其中一个引起了问题,我相信它可能是函数内部的。

否则,如果您使用String splitString = string.split("[=]");,它会根据分隔符'='

拆分该行

然后你可以

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

或者更简单地说,做一个@retrodrone发布的小编辑

答案 2 :(得分:1)

好的,我设法解决了这个问题,对于任何关心的人。代码的问题在于,在以这种方式从中获取标记名称之前,需要将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”bollocks:)

testing-mode = false
name = testman
age = 30

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