Как мне остановить getNodeName (), также печатая тип узла - PullRequest
3 голосов
/ 02 июня 2011

Я в тупике, надеюсь, я только что сделал глупость, которую легко исправить.

Я передаю строку, полную 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 ]

6 голосов
/ 02 июня 2011

Вместо этого вы хотите использовать getNodeValue ():

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

Если вы посмотрите в таблице вверху этой страницы , вы увидите, что для текстовых узлов getNodeName () возвращает # text.

1 голос
/ 03 июня 2011

ОК. Мне удалось решить эту проблему, для всех, кого это волнует. Проблема с кодом заключается в том, что узел должен быть приведен к элементу, прежде чем вы сможете извлечь имя тега из него таким способом. Поэтому:

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

Обратите внимание на новый оператор "if", который я добавил внутри цикла for и приведение узла к элементу перед вызовом getNodeName, который работает для Elements.

1 голос
/ 02 июня 2011

Мне любопытно посмотреть, что каждый из двух вызовов функций в вашем System.out.println() печатает отдельно, только потому, что весь вывод должен быть в одной строке.Одна из этих двух причин вызывает проблемы, и я полагаю, что она может быть внутренней функцией.

В противном случае, если вы используете String splitString = string.split("[=]");, она разделит строку на основе разделителя '='

тогда вы можете

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

или, что намного проще, сделать одно маленькое редактирование, которое @retrodrone опубликовал

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...