LSSerializer 提供了一个 API,用于将 DOM 文档序列化(写入)为 XML。 XML 数据被写入字符串或输出流。在序列化过程中所做的任何更改或修复只会影响序列化数据。 Document 对象及其子对象永远不会被序列化操作改变。
在 XML 数据的序列化过程中,命名空间修复按照附录 B [DOM 3 级核心] 中的定义完成。[DOM 2 级核心] 允许空字符串作为真正的命名空间 URI。如果 Node 的 namespaceURI 是空字符串,序列化会将它们视为 null ,忽略前缀(如果有)。
LSSerializer 接受任何节点类型进行序列化。对于 Document 或 Entity 类型的节点,将尽可能创建格式正确的 XML(如果文档或实体来自解析操作并且自创建以来未更改,则格式正确)。这些节点类型的序列化输出分别是 XML 文档或外部 XML 实体,并且是 XML 解析器可接受的输入。对于所有其他类型的节点,序列化形式取决于实现。
在序列化的 Document 、 DocumentFragment 或 Entity 中, Nodes 的处理如下
- 写入
Document个节点,包括 XML 声明(除非参数“xml-declaration”设置为false)和 DTD 子集(如果 DOM 中存在的话)。写一个Document节点序列化整个文档。 Entity节点,当直接由LSSerializer.write写入时,输出实体扩展但没有命名空间修正完成。生成的输出将作为外部实体有效。- 如果参数“实体”设置为
true,则EntityReference节点在输出中被序列化为“&entityName;”形式的实体引用。实体引用的子节点(扩展)将被忽略。如果参数“实体”设置为false,则仅序列化实体引用的子项。EntityReference没有孩子的节点(没有相应的Entity节点或相应的Entity节点没有孩子)总是被序列化。 CDATAsections包含无法在指定输出编码中表示的内容字符,根据“拆分数据部分”参数进行处理。如果参数设置为true,则CDATAsections被拆分,无法表示的字符被序列化为普通内容中的数字字符引用。未指定拆分的确切位置和数量。如果参数设置为false,如果参数“良构的”设置为true,则CDATAsection中无法表示的字符将报告为"wf-invalid-character"错误。该错误不可恢复 - 没有提供替代字符并继续序列化的机制。DocumentFragment节点是通过按照文档片段中出现的顺序序列化文档片段的子节点来序列化的。- 所有其他节点类型(元素、文本等)都序列化为其相应的 XML 源格式。
笔记:Node 的序列化并不总是生成格式正确的 XML 文档,即 LSParser 在解析生成的序列化时可能会抛出致命错误。
在文档的字符数据中(标记之外),任何无法直接表示的字符都将替换为字符引用。 '<' 和 '&' 的出现被预定义的实体 < 替换。和 &。可能不使用其他预定义实体(>、'和"),除非需要(例如在诸如']]>'的情况下使用>)。无法在输出字符编码中直接表示的任何字符都被序列化为数字字符引用(并且由于字符编码标准通常使用字符的十六进制表示,因此鼓励在序列化字符引用时使用十六进制表示)。
为了允许属性值同时包含单引号和双引号,撇号或单引号字符 (') 可以表示为 "'",双引号字符 (") 表示为 """。换行符和其他不能在输出字符编码的属性值中直接表示的字符被序列化为数字字符引用。
在标记内但在属性外,任何无法在输出字符编码中表示的字符都将报告为 DOMError 致命错误。一个例子是用 encoding="us-ascii" 序列化元素 <LaCañada/> 。这将导致生成 DOMError“wf-invalid-character-in-node-name”(如“良构的”中所提议)。
当通过将 LSSerializer 上的参数“标准化字符”设置为真来请求时,将根据 [XML 1.1] 的附录 E 中包含的 完全归一化 字符的定义对所有要序列化的数据(包括标记和字符数据)执行字符规范化。字符规范化过程只影响正在写入的数据;序列化完成后,它不会改变文档的 DOM 视图。
实现需要支持编码“UTF-8”、“UTF-16”、“UTF-16BE”和“UTF-16LE”,以保证数据在所有 XML 解析器需要支持的所有编码中都是可序列化的.当编码为 UTF-8 时,字节顺序标记是否被序列化,或者输出是大端还是小端,都取决于实现。当编码为 UTF-16 时,输出是大端还是小端取决于实现,但必须为非字符输出生成字节顺序标记,例如 LSOutput.byteStream 或 LSOutput.systemId 。如果未生成字节顺序标记,则会报告“需要字节顺序标记”警告。当编码为UTF-16LE或UTF-16BE时,输出为大端(UTF-16BE)或小端(UTF-16LE),不生成Byte Order Mark。在所有情况下,编码声明(如果生成)将对应于序列化期间使用的编码(例如,如果请求 UTF-16,将出现 encoding="UTF-16")。
命名空间在序列化过程中固定下来,序列化过程将验证命名空间声明、命名空间前缀以及与元素和属性关联的命名空间 URI 是否一致。如果发现不一致,将更改文档的序列化形式以将其删除。序列化文档时用于进行名称空间修复的方法是 [DOM 3 级核心] 的附录 B.1“名称空间规范化”中定义的算法。
序列化文档时,参数“discard-default-content”控制是否序列化非指定数据。
序列化时,错误和警告会通过错误处理程序(LSSerializer.domConfig 的“错误处理器”参数)报告给应用程序。本规范绝不试图定义在序列化 DOM 节点时可能发生的所有可能的错误和警告,但定义了一些常见的错误和警告情况。本规范定义的错误和警告类型(DOMError.type)是:
"no-output-specified" [fatal]-
如果在
LSOutput中未指定输出,则在写入LSOutput时引发。 -
"unbound-prefix-in-entity-reference" [fatal] -
如果配置参数“namespaces”设置为
true并且其替换文本包含未绑定命名空间前缀的实体在没有命名空间前缀绑定的位置被引用,则引发。 -
"unsupported-encoding" [fatal] - 如果遇到不支持的编码,则引发。
除了引发已定义的错误和警告之外,实现还应针对任何其他错误和警告情况(例如 IO 错误(文件未找到、权限被拒绝...)等)引发特定于实现的错误和警告。
- 自从:
- 1.5
-
方法总结
修饰符和类型方法描述LSSerializer在序列化 DOM 节点时使用的DOMConfiguration对象。当应用程序提供过滤器时,序列化程序将在序列化每个节点之前调用过滤器。要在正在写出的 XML 中使用的字符的行尾序列。voidsetFilter(LSSerializerFilter filter) 当应用程序提供过滤器时,序列化程序将在序列化每个节点之前调用过滤器。voidsetNewLine(String newLine) 要在正在写出的 XML 中使用的字符的行尾序列。boolean按照上面LSSerializer接口的一般描述中的描述序列化指定的节点。writeToString(Node nodeArg) 按照上面LSSerializer接口的一般描述中的描述序列化指定的节点。booleanwriteToURI(Node nodeArg, String uri) 一种方便的方法,就像调用LSSerializer.write时使用LSOutput一样,没有指定编码并将LSOutput.systemId设置为uri参数。
-
方法详情
-
getDomConfig
DOMConfiguration getDomConfig()LSSerializer在序列化 DOM 节点时使用的DOMConfiguration对象。
除了 [DOM 3 级核心 ] 中定义的 DOMConfiguration 接口识别的参数外,LSSerializer的DOMConfiguration对象添加或修改了以下参数:"canonical-form""discard-default-content"-
-
true -
[required ] (default ) 使用
Attr.specified属性来决定应丢弃哪些属性。请注意,如果此参数设置为true,某些实现可能会使用实现可用的任何信息(即 XML 模式、DTD、Attr.specified属性等)来确定要丢弃的属性和内容。 false- [required ]保留所有属性和所有内容。
-
"format-pretty-print"-
-
true - [optional ] 通过添加空格来格式化输出以生成漂亮的打印、缩进、人类可读的形式。本规范未指定转换的确切形式。漂亮的打印改变了文档的内容并可能影响文档的有效性,验证实现应该保持有效性。
-
false - [required ] (default ) 不要漂亮地打印结果。
-
-
"ignore-unknown-character-denormalizations" -
-
true -
[required ] (default ) 如果在支持 [XML 1.1 ] 时验证完全规范化,遇到无法确定规范化属性的字符,则引发
"unknown-character-denormalization"警告(而不是引发错误,如果未设置此参数) 并忽略由这些字符引起的任何可能的反规范化。 -
false - [optional] 如果遇到处理器无法确定规范化属性的字符,则报告致命错误。
-
-
"normalize-characters" -
此参数等效于 [DOM 3 级核心] 中
DOMConfiguration定义的参数。与核心不同,此参数的默认值为true。根据 [XML 1.1] 的附录 E,DOM 实现不需要支持 完全归一化 文档中的字符,如果支持,则必须默认激活此参数。 -
"xml-declaration" -
true-
[required ] (default ) 如果
Document、Element或Entity节点被序列化,则应包含 XML 声明或文本声明。版本(Document.xmlVersion如果文档是 Level 3 文档且版本非空,否则使用值“1.0”)和输出编码(有关如何查找输出编码的详细信息,请参阅LSSerializer.write)在序列化的 XML 声明。 -
false -
[required ] 不要序列化 XML 和文本声明。如果这会导致问题(即序列化数据的 XML 版本不是 [XML 1.0],或者需要编码才能重新解析序列化数据),请报告
"xml-declaration-needed"警告。
-
getNewLine
String getNewLine()要在正在写出的 XML 中使用的字符的行尾序列。支持任何字符串,但 XML 仅将特定的一组字符序列视为行尾(参见 [XML 1.0 ] 中的第 2.11 节“行尾处理”,如果序列化内容是 XML 1.0 或第 2.11 节, [XML 1.1] 中的“行尾处理”,如果序列化内容是 XML 1.1)。使用推荐字符序列之外的其他字符序列会导致文档不可序列化或格式不正确)。
在检索时,此属性的默认值是特定于实现的默认行尾序列。 DOM 实现应该选择默认值以匹配所用环境中文本文件的通常约定。实现必须选择一个默认序列,该序列与 XML 1.0 或 XML 1.1 允许的序列之一相匹配,具体取决于序列化的内容。将此属性设置为null会将其值重置为默认值。
-
setNewLine
要在正在写出的 XML 中使用的字符的行尾序列。支持任何字符串,但 XML 仅将特定的一组字符序列视为行尾(参见 [XML 1.0 ] 中的第 2.11 节“行尾处理”,如果序列化内容是 XML 1.0 或第 2.11 节, [XML 1.1] 中的“行尾处理”,如果序列化内容是 XML 1.1)。使用推荐字符序列之外的其他字符序列会导致文档不可序列化或格式不正确)。
在检索时,此属性的默认值是特定于实现的默认行尾序列。 DOM 实现应该选择默认值以匹配所用环境中文本文件的通常约定。实现必须选择一个默认序列,该序列与 XML 1.0 或 XML 1.1 允许的序列之一相匹配,具体取决于序列化的内容。将此属性设置为null会将其值重置为默认值。
-
getFilter
LSSerializerFilter getFilter()当应用程序提供过滤器时,序列化程序将在序列化每个节点之前调用过滤器。过滤器实现可以选择从流中删除节点或提前终止序列化。
在应用了DOMConfiguration参数请求的操作后调用过滤器。例如,如果“cdata 部分”设置为false,CDATA 部分将不会传递给过滤器。 -
setFilter
当应用程序提供过滤器时,序列化程序将在序列化每个节点之前调用过滤器。过滤器实现可以选择从流中删除节点或提前终止序列化。
在应用了DOMConfiguration参数请求的操作后调用过滤器。例如,如果“cdata 部分”设置为false,CDATA 部分将不会传递给过滤器。 -
write
按照上面LSSerializer接口的一般描述中的描述序列化指定的节点。输出被写入提供的LSOutput。
写入LSOutput时,通过查看可通过LSOutput访问的编码信息和按以下顺序写入的项目(或其所有者文档)找到编码:LSOutput.encoding,Document.inputEncoding,Document.xmlEncoding.
如果无法通过上述属性获得编码,则将使用默认编码“UTF-8”。如果不支持指定的编码,则会引发“unsupported-encoding”致命错误。
如果LSOutput中未指定输出,则会引发“未指定输出”致命错误。
实现负责将适当的媒体类型与序列化数据相关联。
写入 HTTP URI 时,将执行 HTTP PUT。当写入其他类型的 URI 时,将数据写入 URI 的机制是依赖于实现的。- 参数:
nodeArg- 要序列化的节点。destination- 序列化 DOM 的目的地。- 返回:
-
如果
node已成功序列化,则返回true。如果正常处理停止但实现继续序列化文档,则返回false;序列化的结果依赖于实现。 - 抛出:
LSException- SERIALIZE_ERR:如果LSSerializer无法序列化节点则引发。如果 DOM 应用程序希望获得有关错误的详细信息,则应使用参数“错误处理器”附加一个DOMErrorHandler。
-
writeToURI
一种方便的方法,就像调用LSSerializer.write时使用LSOutput一样,没有指定编码并将LSOutput.systemId设置为uri参数。- 参数:
nodeArg- 要序列化的节点。uri- 要写入的 URI。- 返回:
-
如果
node已成功序列化,则返回true。如果正常处理停止但实现继续序列化文档,则返回false;序列化的结果依赖于实现。 - 抛出:
LSException- SERIALIZE_ERR:如果LSSerializer无法序列化节点则引发。如果 DOM 应用程序希望获得有关错误的详细信息,则应使用参数“错误处理器”附加一个DOMErrorHandler。
-
writeToString
按照上面LSSerializer接口的一般描述中的描述序列化指定的节点。输出被写入返回给调用者的DOMString。使用的编码是DOMString类型的编码,即UTF-16。请注意,DOMString对象中不会生成字节顺序标记。- 参数:
nodeArg- 要序列化的节点。- 返回:
- 返回序列化数据。
- 抛出:
DOMException- DOMSTRING_SIZE_ERR:如果生成的字符串太长而无法放入DOMString则引发。LSException- SERIALIZE_ERR:如果LSSerializer无法序列化节点则引发。如果 DOM 应用程序希望获得有关错误的详细信息,则应使用参数“错误处理器”附加一个DOMErrorHandler。
-