所以我有以下代码,我几乎从这里复制 了.但问题是我的文本节点不包含任何只有属性的文本.所以我喜欢
<Random name="Katie" num="5"></Random>
Run Code Online (Sandbox Code Playgroud)
我正在使用此代码来解析它:
private void listNodes(Node node, String indent)
{
String nodeName = node.getNodeName();
System.out.println(indent + " Node is: " + nodeName);
if(node instanceof Element && node.hasAttributes())
{
System.out.println(indent + "Attributes are: ");
NamedNodeMap attrs = node.getAttributes();
for (int i = 0; i < attrs.getLength(); i++)
{
Attr attribute = (Attr) attrs.item(i);
System.out.println(indent + attribute.getName() + "=" + attribute.getValue());
}
}
NodeList list = node.getChildNodes();
if (list.getLength() > 0)
{
for (int i = 0; i < list.getLength(); i++)
{
listNodes(list.item(i), indent + " ");
}
}
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我的空文本节点都说
节点是:#text
有谁知道在解析xml文件时如何跳过空节点文本?
谢谢,
玩笑
rob*_*x44 10
使用DTD验证,您可以让解析器自动抑制元素之间的空白.但是,要修改特定实现,可以测试Text节点,如果它们为空则忽略它们.
private void listNodes(Node node, String indent)
{
if (node instanceof Text) {
String value = node.getNodeValue().trim();
if (value.equals("") ) {
return;
}
}
String nodeName = node.getNodeName();
System.out.println(indent + " Node is: " + nodeName);
...
Run Code Online (Sandbox Code Playgroud)
小智 8
您也可以使用Node.getNodeType()方法:
Node node;
if (node.getNodeType() == Node.ELEMENT_NODE) {
// Your code inside this
}
Run Code Online (Sandbox Code Playgroud)
小智 5
'#text'是在空节点上调用getNodeName()方法的结果.这些空节点可以使用'XPath'进行标识,并且可以删除.
XPathFactory xpathFactory = XPathFactory.newInstance();
// XPath to find empty text nodes.
XPathExpression xpathExp = xpathFactory.newXPath().compile(
"//text()[normalize-space(.) = '']");
NodeList emptyTextNodes = (NodeList)
xpathExp.evaluate(doc, XPathConstants.NODESET);
// Remove each empty text node from document.
for (int i = 0; i < emptyTextNodes.getLength(); i++) {
Node emptyTextNode = emptyTextNodes.item(i);
emptyTextNode.getParentNode().removeChild(emptyTextNode);
}
Run Code Online (Sandbox Code Playgroud)
'#text'是由空格空间生成的.