当前位置: 首页 > 知识库问答 >
问题:

使用java进行DOM解析的规范化-它是如何工作的?

凌智
2023-03-14

在本教程中,我在DOM解析器的代码中看到了下面这一行。

doc.getDocumentElement().normalize();

我们为什么要做这种常态化?< br >我阅读了文档,但一个字也看不懂。

将所有文本节点置于此节点下方子树的完整深度

好的,那么有人能给我看看(最好有图片)这棵树长什么样吗?

有人能解释一下为什么需要规范化吗?
如果我们不规范化会发生什么?

共有3个答案

宰父衡
2023-03-14

作为@JBNizet对更多技术用户的回答的扩展,这里是org.w3c.dom.Node接口com.sun.org.apache.xerces.internal.dom.ParentNode中的实现,让您了解它实际上是如何工作的。

public void normalize() {
    // No need to normalize if already normalized.
    if (isNormalized()) {
        return;
    }
    if (needsSyncChildren()) {
        synchronizeChildren();
    }
    ChildNode kid;
    for (kid = firstChild; kid != null; kid = kid.nextSibling) {
         kid.normalize();
    }
    isNormalized(true);
}

它递归遍历所有节点并调用kid.normalize()
此机制在org.apache.xerces.dom.ElementImpl中被覆盖

public void normalize() {
     // No need to normalize if already normalized.
     if (isNormalized()) {
         return;
     }
     if (needsSyncChildren()) {
         synchronizeChildren();
     }
     ChildNode kid, next;
     for (kid = firstChild; kid != null; kid = next) {
         next = kid.nextSibling;

         // If kid is a text node, we need to check for one of two
         // conditions:
         //   1) There is an adjacent text node
         //   2) There is no adjacent text node, but kid is
         //      an empty text node.
         if ( kid.getNodeType() == Node.TEXT_NODE )
         {
             // If an adjacent text node, merge it with kid
             if ( next!=null && next.getNodeType() == Node.TEXT_NODE )
             {
                 ((Text)kid).appendData(next.getNodeValue());
                 removeChild( next );
                 next = kid; // Don't advance; there might be another.
             }
             else
             {
                 // If kid is empty, remove it
                 if ( kid.getNodeValue() == null || kid.getNodeValue().length() == 0 ) {
                     removeChild( kid );
                 }
             }
         }

         // Otherwise it might be an Element, which is handled recursively
         else if (kid.getNodeType() == Node.ELEMENT_NODE) {
             kid.normalize();
         }
     }

     // We must also normalize all of the attributes
     if ( attributes!=null )
     {
         for( int i=0; i<attributes.getLength(); ++i )
         {
             Node attr = attributes.item(i);
             attr.normalize();
         }
     }

    // changed() will have occurred when the removeChild() was done,
    // so does not have to be reissued.

     isNormalized(true);
 } 

希望这能节省你一些时间。

司马腾
2023-03-14

简单来说,规范化是减少冗余。
冗余示例:
a) 根/文档标记外的空格(...

阙阳
2023-03-14

句子的其余部分是:

其中只有结构(例如,元素、注释、处理指令、CDATA节和实体引用)分隔文本节点,即,既没有相邻的文本节点也没有空的文本节点。

这基本上意味着以下XML元素

<foo>hello 
wor
ld</foo>

可以在非规范化节点中这样表示:

Element foo
    Text node: ""
    Text node: "Hello "
    Text node: "wor"
    Text node: "ld"

规范化后,节点将如下所示

Element foo
    Text node: "Hello world"

属性也是如此:

 类似资料:
  • 问题内容: 我在DOM解析器的代码中看到以下行。 我们为什么要进行这种归一化? 我阅读了文档,但我听不懂一个字。 将所有Text节点置于此节点下子树的完整深度 好吧,那么有人可以告诉我(最好是附照片)这棵树是什么样的吗? 谁能解释我为什么需要规范化? 如果我们不规范会怎样? 问题答案: 句子的其余部分是: 其中只有结构(例如元素,注释,处理指令,CDATA节和实体引用)将文本节点分开,即,既没有相

  • 问题内容: 我正在做一个Junit教程,遇到了正在测试的标准化函数。定义如下: 此功能如何工作?它实际上在做什么? 问题答案: 它与以下功能相同: 除了所有操作都是通过反射执行的。

  • 我搜索过,似乎这被称为列表理解,但它是如何工作的?

  • 问题内容: 我有下面的xml: Ι要解析此xml文件并从 ListofDocs 获取 主题ID 和 百分比 __ 第一种方法是从xml获取所有文档元素,然后检查祖父节点是否为ListofDocs。但是元素文档存在于 rankDocs 和 listOfDocs中 ,因此我有一个很大的列表。 所以我想知道是否存在更好的解决方案来解析此xml以避免if语句? 我的代码: 问题答案: 首先,在检查节点名称

  • 问题内容: 我有下面的xml: Ι要解析此xml文件并从 ListofDocs 获取 主题ID 和 百分比 __ 第一种方法是从xml获取所有文档元素,然后检查祖父节点是否为ListofDocs。但是元素文档存在于 rankDocs 和 listOfDocs中 ,因此我有一个很大的列表。 所以我想知道是否存在更好的解决方案来解析此xml以避免if语句? 我的代码: 问题答案: 首先,在检查节点名称

  • 我想使用Batchnormalization来规范化批次维度,但keras中的批次维度自然是无维度的。那我该怎么办呢。 keras示例显示,conv2d的轴为-1,这表示通道尺寸。 轴:整数,应规格化的轴(通常是特征轴)。例如,在具有data\u format=“channels\u first”的Conv2D层之后,在BatchNormalization中设置axis=1。