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