我被难住了,希望我刚刚做了一件可以轻松修复的愚蠢事情。
我传递了一个充满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。
您想使用getNodeValue():
System.out.println(client_details.item(i).getNodeValue()+" = "+getTextContents(client_details.item(i)));
如果您查看该页面顶部的表,您会发现对于Text节点,getNodeName()返回#Text。
我很想看看System.out.println()
中的两个函数调用中的每一个都是分别打印出来的,只是因为整个输出应该在一行上。这两者中的一个导致了问题,我相信这可能是功能内部的问题。
否则,如果您使用String splitString = string.split("[=]");
,它将根据delimeter"="拆分线路
然后你可以
String splitString = string.split("[=]");
System.out.println(splitString[1] + " = " + splitString[2]);
或者,更简单地说,对@Retrodone发布的进行一次小编辑
好吧,我为其他关心我的人解决了这个问题。代码的问题在于,在以这种方式从Node中获取标记名称之前,需要将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"胡说八道:)
testing-mode = false
name = testman
age = 30
请注意,在调用getNodeName之前,我在for循环中添加了新的"if"语句,并将节点强制转换为元素,这对元素有效。