public interface LSSerializer
org.w3c.dom.ls.LSSerializer |
LSSerializer
提供了一个用于将DOM文档序列化(写入)为XML的API。 XML数据被写入字符串或输出流。 序列化过程中所做的任何更改或修正只会影响序列化的数据。 序列化操作决不会更改Document
对象及其子项。
在XML数据序列化过程中,命名空间修复按照附录B [ DOM Level 3 Core ]中的定义完成。[ DOM Level 2 Core ]允许将空字符串作为真实的命名空间URI。 如果namespaceURI
的Node
为空字符串,则序列化将它们视为null
,忽略前缀(如果有)。
LSSerializer
接受任何用于序列化的节点类型。 对于类型为Document
或Entity
节点,尽可能创建格式良好的XML(如果文档或实体来自解析操作并且自创建之后保持不变,则保证格式良好)。 这些节点类型的序列化输出分别作为XML文档或外部XML实体,并且是XML解析器的可接受输入。 对于所有其他类型的节点,序列化形式是与实现相关的。
内的 Document
, DocumentFragment
,或 Entity
被序列化, Nodes
进行如下处理
Document
nodes are written, including the XML declaration (unless the parameter "xml-declaration" is set to false
) and a DTD subset, if one exists in the DOM. Writing a Document
node serializes the entire document. Entity
nodes, when written directly by LSSerializer.write
, outputs the entity expansion but no namespace fixup is done. The resulting output will be valid as an external entity. true
, EntityReference
nodes are serialized as an entity reference of the form " &entityName;
" in the output. Child nodes (the expansion) of the entity reference are ignored. If the parameter " entities" is set to false
, only the children of the entity reference are serialized. EntityReference
nodes with no children (no corresponding Entity
node or the corresponding Entity
nodes have no children) are always serialized. CDATAsections
containing content characters that cannot be represented in the specified output encoding are handled according to the " split-cdata-sections" parameter. If the parameter is set to true
, CDATAsections
are split, and the unrepresentable characters are serialized as numeric character references in ordinary content. The exact position and number of splits is not specified. If the parameter is set to false
, unrepresentable characters in a CDATAsection
are reported as "wf-invalid-character"
errors if the parameter " well-formed" is set to true
. The error is not recoverable - there is no mechanism for supplying alternative characters and continuing with the serialization. DocumentFragment
nodes are serialized by serializing the children of the document fragment in the order they appear in the document fragment. 注意: Node
的序列化并不总是生成格式良好的XML文档,即 LSParser
在解析结果序列化时可能会引发致命错误。
在文档的字符数据中(标记之外),不能直接表示的任何字符都将替换为字符引用。 “<”和“&”的出现由预定义的实体&lt; 和&amp ;. 其他预定义实体(&gt ;,'和')可能不被使用,除非需要(例如,在诸如']]>'的情况下使用&gt ;. 在输出字符编码中不能直接表示的任何字符都被序列化为数字字符引用(并且由于字符编码标准通常使用字符的十六进制表示,因此鼓励在序列化字符引用时使用十六进制表示形式)。
要允许属性值包含单引号和双引号,撇号或单引号字符(')可以表示为“'”,双引号字符(“)as”“”。在输出字符编码的属性值中不能直接表示的其他字符将被序列化为数字字符引用。
在标记中但在属性之外,任何不能用输出字符编码表示的字符都会报告为DOMError
致命错误。 一个例子是序列化元素<LaCa?ada />与encoding="us-ascii"
。 这将导致生成DOMError
“wf-invalid-character-in-node-name”(如“ well-formed ”中所建议的)。
当通过将LSSerializer上的参数“ normalize-characters ” LSSerializer
为真时,根据[ XML 1.1 ]附录E中fully normalized字符的定义,对要序列化的所有数据(标记和字符数据)执行字符标准化。 字符规范化过程只影响正在写入的数据; 在序列化完成后,它不会更改DOM的文档视图。
实现需要支持编码“UTF-8”,“UTF-16”,“UTF-16BE”和“UTF-16LE”,以确保数据在需要所有XML解析器支持的所有编码中可序列化。 当编码是UTF-8时,不管字节顺序标记是否被序列化,或者输出是大端还是小端,都取决于实现。 当编码为UTF-16时,无论输出是大端还是小端,都依赖于实现,但必须为非字符输出(如LSOutput.byteStream
或LSOutput.systemId
生成字节顺序标记。 如果未生成字节顺序标记,则会报告“需要字节顺序标记”的警告。 当编码为UTF-16LE或UTF-16BE时,输出为big-endian(UTF-16BE)或little-endian(UTF-16LE),并且不会生成字节顺序标记。 在所有情况下,编码声明(如果生成)都将对应于序列化过程中使用的编码(例如,如果请求UTF-16,将显示encoding="UTF-16"
)。
命名空间在序列化过程中被修复,序列化过程将验证命名空间声明,命名空间前缀和与元素和属性关联的命名空间URI是否一致。 如果发现不一致,则会更改文档的序列化格式以将其删除。 序列化文档时用于执行名称空间修复的方法是[ DOM Level 3 Core ]的附录B.1“名称空间规范化”中定义的算法。
在序列化文档时,参数“discard-default-content”控制是否序列化非指定的数据。
在序列化时,错误和警告通过错误处理程序( LSSerializer.domConfig
的“ error-handler ”参数)报告给应用程序。 本规范绝不会尝试定义序列化DOM节点时可能发生的所有可能的错误和警告,但会定义一些常见的错误和警告情况。 本规范定义的错误和警告类型( DOMError.type
)为:
"no-output-specified" [fatal]
LSOutput
if no output is specified in the
LSOutput
.
"unbound-prefix-in-entity-reference" [fatal]
true
and an entity whose replacement text contains unbound namespace prefixes is referenced in a location where there are no bindings for the namespace prefixes.
"unsupported-encoding" [fatal]
除了提出定义的错误和警告之外,实现还应该针对任何其他错误和警告情况(如IO错误(文件未找到,权限被拒绝,等等))引发实现特定的错误和警告。
另请参阅 Document Object Model (DOM) Level 3 Load and Save Specification 。
Public methods |
|
---|---|
abstract DOMConfiguration |
getDomConfig() 所述 |
abstract String |
getNewLine() 要写出的XML中使用的行尾字符序列。 |
abstract void |
setNewLine(String newLine) 要写出的XML中使用的行尾字符序列。 |
abstract boolean |
write(Node nodeArg, LSOutput destination) 按照上述 |
abstract String |
writeToString(Node nodeArg) 按照上述 |
abstract boolean |
writeToURI(Node nodeArg, String uri) 一种方便的方法,就像调用 |
DOMConfiguration getDomConfig ()
所述DOMConfiguration
使用由对象LSSerializer
序列化DOM节点时。
除了[ DOM Level 3 Core ]中定义的DOMConfiguration接口识别的参数外, LSSerializer的DOMConfiguration
对象LSSerializer
添加或修改了以下参数:
"canonical-form"
true
true
will set the parameters "format-pretty-print", "discard-default-content", and "xml-declaration ", to
false
. Setting one of those parameters to
true
will set this parameter to
false
. Serializing an XML 1.1 document when "canonical-form" is
true
will generate a fatal error.
false
"discard-default-content"
true
Attr.specified
attribute to decide what attributes should be discarded. Note that some implementations might use whatever information available to the implementation (i.e. XML schema, DTD, the
Attr.specified
attribute, and so on) to determine what attributes and content to discard if this parameter is set to
true
.
false
"format-pretty-print"
true
false
"ignore-unknown-character-denormalizations"
true
"unknown-character-denormalization"
warning (instead of raising an error, if this parameter is not set) and ignore any possible denormalizations caused by these characters.
false
"normalize-characters"
DOMConfiguration
in [
DOM Level 3 Core] . Unlike in the Core, the default value for this parameter is
true
. While DOM implementations are not required to support
fully normalizing the characters in the document according to appendix E of [
XML 1.1], this parameter must be activated by default if supported.
"xml-declaration"
true
Document
,
Element
, or
Entity
node is serialized, the XML declaration, or text declaration, should be included. The version (
Document.xmlVersion
if the document is a Level 3 document and the version is non-null, otherwise use the value "1.0"), and the output encoding (see
LSSerializer.write
for details on how to find the output encoding) are specified in the serialized XML declaration.
false
"xml-declaration-needed"
warning if this will cause problems (i.e. the serialized data is of an XML version other than [
XML 1.0], or an encoding would be needed to be able to re-parse the serialized data).
Returns | |
---|---|
DOMConfiguration |
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
将重置其值为默认值。
Returns | |
---|---|
String |
void setNewLine (String newLine)
要写出的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
将重置其值为默认值。
Parameters | |
---|---|
newLine |
String
|
boolean write (Node nodeArg, LSOutput destination)
按照上述LSSerializer
接口的一般描述序列化指定的节点。 输出写入提供的LSOutput
。
在写入LSOutput
,通过查看通过LSOutput
和要写入的项目(或其所有者文档)可按以下顺序访问的编码信息来查找编码:
LSOutput.encoding
, Document.inputEncoding
, Document.xmlEncoding
. LSOutput
, a "no-output-specified" fatal error is raised.
Parameters | |
---|---|
nodeArg |
Node : The node to serialize. |
destination |
LSOutput : The destination for the serialized DOM. |
Returns | |
---|---|
boolean |
Returns true if node was successfully serialized. Return false in case the normal processing stopped but the implementation kept serializing the document; the result of the serialization being implementation dependent then. |
Throws | |
---|---|
LSException |
SERIALIZE_ERR: Raised if the LSSerializer was unable to serialize the node. DOM applications should attach a DOMErrorHandler using the parameter " error-handler" if they wish to get details on the error. |
String writeToString (Node nodeArg)
按照上述LSSerializer
接口的一般描述序列化指定的节点。 输出被写入返回给调用者的DOMString
。 使用的编码是DOMString
类型的编码,即UTF-16。 请注意,在DOMString
对象中不会生成字节顺序标记。
Parameters | |
---|---|
nodeArg |
Node : The node to serialize. |
Returns | |
---|---|
String |
Returns the serialized data. |
Throws | |
---|---|
DOMException |
DOMSTRING_SIZE_ERR: Raised if the resulting string is too long to fit in a DOMString . |
LSException |
SERIALIZE_ERR: Raised if the LSSerializer was unable to serialize the node. DOM applications should attach a DOMErrorHandler using the parameter " error-handler" if they wish to get details on the error. |
boolean writeToURI (Node nodeArg, String uri)
一种方便的方法,就好像 LSSerializer.write
被调用 LSOutput
而没有指定编码,而 LSOutput.systemId
设置为 uri
参数。
Parameters | |
---|---|
nodeArg |
Node : The node to serialize. |
uri |
String : The URI to write to. |
Returns | |
---|---|
boolean |
Returns true if node was successfully serialized. Return false in case the normal processing stopped but the implementation kept serializing the document; the result of the serialization being implementation dependent then. |
Throws | |
---|---|
LSException |
SERIALIZE_ERR: Raised if the LSSerializer was unable to serialize the node. DOM applications should attach a DOMErrorHandler using the parameter " error-handler" if they wish to get details on the error. |