我很难过,希望我刚刚做了一件我可以轻松解决的蠢事。
我传入一个充满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。
答案 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来说是有效的。