【问题标题】:What is xml normalization? [duplicate]什么是 xml 规范化? [复制]
【发布时间】:2011-10-05 09:15:28
【问题描述】:

可能重复:
What does Java Node normalize method do?

什么是 xml 规范化。我在 javadoc 中找到了以下内容,但我无法理解?有人可以帮忙吗?

public void normalize()

将所有文本节点放在此节点下的子树的完整深度中,包括属性节点,进入“正常”形式,其中只有结构(例如,元素、cmets、处理指令、CDATA 部分和实体引用)分隔Text节点,即没有相邻的Text节点,也没有空的Text节点。这可用于确保文档的 DOM 视图与保存和重新加载时相同,并且在依赖于特定文档树结构的操作(例如 XPointer [XPointer] 查找)时很有用使用。如果附加到 Node.ownerDocument 的 DOMConfiguration 对象的参数“normalize-characters”为 true,则此方法还将完全规范化 Text 节点的字符。 注意:在文档包含 CDATASection 的情况下,单独的规范化操作可能还不够,因为 XPointers 不区分 Text 节点和 CDATASection 节点。 自从: DOM 3 级

【问题讨论】:

  • 提供指向该 javadoc 的链接会很有帮助:)

标签: java xml terminology normalization


【解决方案1】:

API 文档解释得很详细,不知道有什么要解释的。基本上,该方法通过组合相邻的文本节点、消除空文本节点以及可选地规范化 Unicode 组合的字符,将从 this 节点开始的 DOM 子树转换为“标准格式”。

【讨论】:

  • 我猜 OP 要求的是一个简单的英语示例,也许是最少的行话。好吧,这样想——你会如何向外行解释?另请参阅我对 Ed Staub 回答的评论。
【解决方案2】:

解析器通常会返回“令人惊讶”的文本节点,其中文本被拆分为多个节点,或者不太常见的是空文本节点。这是精简它们以获得最大性能的副作用。当存在可忽略的空白、缓冲区边界或其他任何对解析器方便的地方时,可能会发生这种情况。

normalize() 将摆脱所有这些惊喜,合并相邻的文本节点并删除空节点。

【讨论】:

  • 你能给我们举个例子吗?即当我们在没有 normalize() 的情况下解析它时肯定会抛出“惊喜”的 xml 文档?一旦我们可以与 normalize 和没有它进行比较,我们就可以看到差异,一切都会更加清晰。
  • @AppleGrinder - 我无法可靠地指出任何特定示例 - 这取决于您使用的解析器。但是,我认为可以肯定地说,如果一个元素的文本是 1 MB 长,那么由于在缓冲区边界处拆分,您将获得多个文本节点。最不可预测的节点拆分是在缓冲区边界上完成的,因为它很少而且似乎“随机”发生,因此测试可能会通过。我知道我见过 Apache Xerces(因此可能是默认的 Java 解析器)这样做。
  • 我希望在某些东西操纵 DOM 之后出现多个文本节点,而不是来自解析器。是否有文档或发生这种情况的示例?如果您通过将文本节点附加到位置来修改树,但有一个算法假设每个元素不超过 1 个您想要在这些修改后运行的文本节点,那么就是使用 normalize 的时候了。
  • @binki 自从我写这篇文章以来,大坝已经流了很多水,事情可能已经改变了。我不再做Java了。如果您想测试特定的解析器,我建议您至少在单个节点中解析一兆字节的文本。让解析器从磁盘读取文件——不要将整个文件都输入内存。这个想法是确保解析器在节点中间遇到读取缓冲区边界。如果它不拆分它,它可能会为你正常化。
  • @binki 但是,如果没有文档的一些保证,我不会做任何假设。
猜你喜欢
  • 1970-01-01
  • 2013-11-08
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-22
  • 2016-10-12
相关资源
最近更新 更多