Android 为什么我的xml文件中有#文本节点?
我正在制作一个android应用程序,它对xml文件进行DOM解析。我有一个如下所示的xml文件:Android 为什么我的xml文件中有#文本节点?,android,dom,xml-parsing,Android,Dom,Xml Parsing,我正在制作一个android应用程序,它对xml文件进行DOM解析。我有一个如下所示的xml文件: <?xml version="1.0" encoding="utf-8"?> <family> <grandparent> <parent1> <child1>Foo</child1> <child2>B
<?xml version="1.0" encoding="utf-8"?>
<family>
<grandparent>
<parent1>
<child1>Foo</child1>
<child2>Bar</child2>
</parent1>
<parent2>
<child1>Raz</child1>
<child2>Mataz</child2>
</parent2>
</grandparent>
</family>
try {
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(input);
doc.getDocumentElement().normalize(); //added in since the edit
NodeList nodd = doc.getElementsByTagName("grandparent");
for (int x = 0; x < nodd.getLength(); x++){
Node node = nodd.item(x);
NodeList nodes = node.getChildNodes();
for(int y = 0; y < nodes.getLength(); y++){
Node n = nodes.item(y);
System.out.println(n.getNodeName());
}
}
}
福
酒吧
拉兹
马塔兹
如果我在其上运行dom解析器,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<family>
<grandparent>
<parent1>
<child1>Foo</child1>
<child2>Bar</child2>
</parent1>
<parent2>
<child1>Raz</child1>
<child2>Mataz</child2>
</parent2>
</grandparent>
</family>
try {
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(input);
doc.getDocumentElement().normalize(); //added in since the edit
NodeList nodd = doc.getElementsByTagName("grandparent");
for (int x = 0; x < nodd.getLength(); x++){
Node node = nodd.item(x);
NodeList nodes = node.getChildNodes();
for(int y = 0; y < nodes.getLength(); y++){
Node n = nodes.item(y);
System.out.println(n.getNodeName());
}
}
}
试试看{
DocumentBuilder=DocumentBuilderFactory.newInstance().newDocumentBuilder();
文档doc=builder.parse(输入);
doc.getDocumentElement().normalize();//自编辑后添加
NodeList nodd=doc.getElementsByTagName(“祖父母”);
对于(int x=0;x
我的应用程序打印出以下内容
07-20 18:24:28.395:信息/系统输出(491):#文本
07-20 18:24:28.395:信息/系统输出(491):家长1
07-20 18:24:28.395:信息/系统输出(491):#文本
07-20 18:24:28.395:信息/系统输出(491):家长2
07-20 18:24:28.395:信息/系统输出(491):#文本
我的问题是,这些文本字段是什么?更重要的是,我如何去除它们
编辑:现在我知道了它们是什么,我试着将其规范化。我已更新代码以反映更改,但结果相同。是空白(换行符、空格、制表符):解析文档时执行此操作
Document doc = builder.parse(input);
doc.getDocumentElement().normalize();
这将有点泄气xml文件并删除所有不需要的文本子项。这就是您得到的:
1) 一个节点列表,其中所有节点都是父节点
NodeList nodd = doc.getElementsByTagName("grandparent");
2) 父级x的所有子节点
NodeList nodes = node.getChildNodes();
哪些是的子节点
< grandparent >
< parent1 >
...
< /parent1 >
< parent2 >
...
< /parent2 >
< /grandparent >
之间可能有文本,这是#文本,如果您有:
< grandparent >
yourTextHere1
< parent1 >
...
< /parent1 >
yourTextHere2
< parent2 >
...
< /parent2 >
yourTextHere3
< /grandparent >
你的短信在这里1
...
你的短信在这里
...
你的短信在这里
祖父母>
你会得到:
你的短信在这里1
父母1
你的短信在这里
父母2
你的短信在这里
我希望这对你有帮助!
Julien,我测试了这个,它不起作用。我仍然可以看到#文本子项。那么我如何摆脱文本子项或测试文本子项呢;doc.getDocumentElement().normalize();正如我的同事所说,我的一条信息是:)这就是我的想法,但我能确保它们永远是彼此的吗?在我看来,是的,如果不是,就意味着它不是XML格式的。可能还有另一种解决方案(我不知道),但这是我使用过的解决方案,到目前为止从未遇到过问题…我也发现了这一点,根据您使用的解析器,可能有一个类似bool isContentWhiteSpace()的函数或一个您可以获得的属性。。。看到这个了吗?我怎么检查?我想我可以做一个
getNextSibling()
但是我能指望第一个孩子总是有一个#text
吗?你不能指望#text是第一个,因为以后可能会有一些。但是,你说的删除是什么意思?如果你正在收集所有节点并将它们输出到某个地方,只需在生成它们时检查每个节点,查看其类型,如果它是文本且内容都是空白,就不要输出它。我认为删除是一个糟糕的术语,我是在保证文本所在的位置不会有文本的情况下运行的。但你提出的正是我想要的。我可以在getNodeType()上运行检查。谢谢。很高兴它起作用了。我检查了normalize
的定义,它将删除完全空的文本节点,但不会删除完全由空格组成的节点。因此,是的,忽略是一条路要走。