Как мне остановить getNodeName (), также печатающий тип узла

#java #xml #netbeans

#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, если это поможет.

Комментарии:

1. Я не думаю, что у вас, может, я пробовал, была такая же проблема

Ответ №1:

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

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

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

Комментарии:

1. Но getNodeValue() все еще помещает строку, только она пустая со знаком «=», и теперь имена элементов были заменены на nulls : (

2. @retrodrone Предоставленная вами ссылка недействительна.

Ответ №2:

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

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

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

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

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

Ответ №3:

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

 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, который работает для элементов.