Android 为什么我的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

我正在制作一个android应用程序,它对xml文件进行DOM解析。我有一个如下所示的xml文件:

<?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
的定义,它将删除完全空的文本节点,但不会删除完全由空格组成的节点。因此,是的,忽略是一条路要走。