使用 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());
}
}
请帮我解决这个问题。谢谢提前。
最佳答案
在 XML 中几乎所有东西都是节点,并且所有节点都实现 getNodeName()
(或每个解析器中的类似语法)。元素和属性是节点,并且具有显式节点名称(elementName(在您的情况下 "test", "a", "b", "c", "files", "file"
)或 attributeName(您没有属性))。 text()
节点 和 和 comment()
节点没有单独的节点名称。解析器通常会给它们一个公共(public)节点名称 #text
或#comment
这样你就可以看到它们是什么类型。 (唯一的其他逻辑选择是 null 或emptyString 或抛出异常,所有这些都会更糟。)
"While using getNodeName, it will return actual value with "#text" as prefix"
。你确定吗?
确保您没有将节点的名称与其值混淆。有两个单独的操作:
getNodeName()
应该返回 "#text"
对于所有文本节点。 getValue()
应该返回 "myfile1"
(可能尾随 \n
)。请注意,您的文件包含许多空白文本节点。
请注意,如果您对某个元素进行 getValue(),则该元素是所有后代的串联字符串,包括空格。
另请注意字符串 "myfile1"
不是 elementNode 文件的子文件。 elementNode 有一个子节点 text()
字符串值为 "myfile1"
的节点.
关于java - java 中的 XMLParser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16542974/