当前位置: 首页 > 面试题库 >

为什么我得到额外的文本节点作为根节点的子节点?

邰昀
2023-03-14
问题内容

我想打印根节点的子元素。这是我的XML文件。

<?xml version="1.0"?>
<!-- Comment-->
<company>
   <staff id="1001">
       <firstname>yong</firstname>
       <lastname>mook kim</lastname>
       <nickname>mkyong</nickname>
       <salary>100000</salary>
   </staff>
   <staff id="2001">
       <firstname>low</firstname>
       <lastname>yin fong</lastname>
       <nickname>fong fong</nickname>
       <salary>200000</salary>
   </staff>
</company>

根据我的理解,根节点是“公司”,其子节点必须是“职员”和“职员”(因为存在“职员”节点2次)。但是,当我尝试通过我的Java代码获取它们时,我得到了5个子节点。3个额外的文本节点从哪里来?

Java代码:

package com.training.xml;

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ReadingXML {

public static void main(String[] args) {
    try {

        File file = new File("D:\\TestFile.xml");

        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(file);
        doc.getDocumentElement().normalize();

        System.out.println("root element: " + doc.getDocumentElement().getNodeName());

        Node rootNode = doc.getDocumentElement(); 
        System.out.println("root: " + rootNode.getNodeName());

        NodeList nList = rootNode.getChildNodes();

        for(int i = 0; i < nList.getLength(); i++) {
            System.out.println("node name: " + nList.item(i).getNodeName() );
        }           
    } catch(Exception e) {
        e.printStackTrace();
    }
}
}

输出:

root element: company
root: company
node name: #text
node name: staff
node name: #text
node name: staff
node name: #text

为什么三个文本节点要过来?


问题答案:

为什么三个文本节点要过来?

它们是子 元素 之间的空白。如果只需要子元素,则应忽略其他类型的节点:

for (int i = 0;i < nList.getLength(); i++) {
    Node node = nList.item(i);
    if (node.getNodeType() == Node.ELEMENT_NODE) {
        System.out.println("node name: " + node.getNodeName());
    }
}

或者,您可以将文档更改为没有该空格。

或者,您可以使用其他XML API,使您可以轻松地仅索要元素。(DOM API在各种方面都很痛苦。)

如果只想忽略元素内容空白,则可以使用Text.isElementContentWhitespace



 类似资料:
  • 我想打印根节点的子元素。这是我的XML文件。 根据我的理解,根节点是“company”,其子节点必须是“staff”和“staff”(因为有两个“staff”节点)。但是当我试图通过java代码获取它们时,我得到了5个子节点。3个额外的文本节点来自哪里? Java代码: 输出: 为什么这三个文本节点会出现在这里?

  • 问题很简单:从这里: 我必须分析一下: 这意味着每个属性都应该成为一个新的根节点。但对我来说,最困难的是我不能从“属性”中设置“属性”值作为对象节点名称。 这对我来说是个挑战。我可以在根节点中设置新节点。已经从“attributes”中获得了一个映射,然后尝试使用forEach对它们进行迭代,以便将结果放入一个节点中,但如图所示,我必须使用“property”将其设置为对象名称的键,然后获取值并设

  • 我需要以下xslt代码方面的帮助。我的意见如下: 我的预期输出为: 我曾尝试使用*/text()获取值节点的值,但我只从第一个孩子获得文本。将来我有很多这样的子元素。 提前谢谢。 你好,Minakshi

  • 我有一个XML文档,它包含一个非常复杂(对我来说)的结构,没有换行符。它有许多具有类似结构的元素: 我需要得到节点值的文本,这是节点成员的孩子也有孩子的名字与特定的文本(在这种情况下virtual_size)。也有可能存在几个类似的节点。我可以用[1]etc吗? 这让我知道了节点的名称,但是如何达到“值”节点呢?

  • 我正在寻找下面输入和输出XML的XSLT(1.0)代码。 在输出XML中,C6元素下可以有任何子节点。在下面的XML中,我放了CN元素,但它可以是任何名称。 输入XML- 所需的输出XML- 先谢谢你。

  • 如果我没弄错的话,树通常是一个列表,其中的元素按特定顺序排列。孩子们不在他们自己的子列表中,他们都在同一个列表中。 所以,我试图创建一个Tree类,其中包含TreeNodes(类)使用Tree类中的List。 我如何跟踪父母/孩子/叶子?如果父母“父母1”,有两个孩子“孩子A”和“孩子B”,我如何将他们联系在一起?