使用getNodeName时,它将以“#text”作为前缀返回实际值。我不想要那个前缀。
如果我删除空格和换行符,getNodeName工作正常。我正在使用DocumentBuilderFactory,DocumentBuilder和Document来解析xml。
我的XML文件
<test>
<a>
file1
</a>
<b>
file2
</b>
<c>
<files>
<file>
myfile1
</file>
</files>
</c>
</test>
我的java方法
NodeList childNodes = null;
NodeList parentNodes = xml.getNodeList("test");
int node_len = parentNodes.getLength();
for (int i = 0; i < node_len; i++)
{
childNodes = parentNodes.item(i).getChildNodes();
int child_len = childNodes.getLength();
for (int j = 0; j < child_len; j++)
{
Node dataNode = childNodes.item(j);
System.out.println(dataNode.getNodeName());
}
}
请帮我解决这个问题。谢谢你的到来。
答案 0 :(得分:3)
在XML中,几乎所有东西都是节点,所有节点都实现getNodeName()
(或每个解析器中的类似语法)。元素和属性是节点,并具有显式节点名称(elementName(在您的情况下为"test", "a", "b", "c", "files", "file"
)或attributeName(您没有属性))。 text()
个节点和comment()
节点没有单独的节点名称。解析器通常会为它们提供一个#text
或#comment
的公共nodeName,这样您就可以看到它们的类型。 (唯一的其他逻辑替代方案是null或emptyString或抛出异常,所有这些都会更糟。)
"While using getNodeName, it will return actual value with "#text" as prefix"
。你确定吗?
请确保您不会将节点名称与其值混淆。有两个独立的操作:
getNodeName()
应为所有文本节点返回"#text"
。 getValue()
应该返回"myfile1"
(可能跟踪\n
)。请注意,您的文件包含许多空白文本节点。
注意,如果你得到一个元素的Value(),那就是所有后代的连接字符串,包括空格。
另请注意,字符串"myfile1"
不是elementNode文件的子代。 elementNode有一个子text()
节点,其字符串值为"myfile1"
。
答案 1 :(得分:1)
除了@ peter.murray.rust给出的答案之外,我想建议您检查节点是否实际上是Element
(在您的情况下是预期的),强制转换为Element
并调用getTagName()
:
if(dataNode instanceof Element) {
String tag = ((Element)dataNode).getTagName();
}
答案 2 :(得分:0)
尝试删除文本节点。
for (int j = 0; j < child_len; j++)
{
Node dataNode = childNodes.item(j);
if (dataNode.getNodeType() == Node.ELEMENT_NODE) {
System.out.println(dataNode.getNodeName());
}
}
条件dataNode.getNodeType()== Node.ELEMENT_NODE将删除所有非元素节点。
答案 3 :(得分:0)
for (int j = 0; j < child_len; j++)
{
Node dataNode = childNodes.item(j);
if(dataNode.getAttributes() != null)
System.out.println(dataNode.getNodeName());
/*or
if (dataNode.getNodeType() == Node.ELEMENT_NODE)
{
System.out.println(dataNode.getNodeName());
}
*/
}
}