このページは大阪弁化フィルタによって翻訳生成されたんですわ。

翻訳前ページへ


DOM Parsing and Serialization
The Wayback Machine - http://web.archive.org/web/20111112173946/http://html5.org:80/specs/dom-parsing.html

Abstract

Table of contents

  1. Issues
  2. 1 Conformance
    1. 1.1 Dependencies
    2. 1.2 Extensibility
  3. 2 Terminology
  4. 3 Parsing and serializing Nodes
    1. 3.1 Parsing
    2. 3.2 Serializing
  5. 4 The DOMParser interface
  6. 5 The XMLSerializer interface
  7. 6 Extensions to the Element interface
    1. 6.1 innerHTML
    2. 6.2 outerHTML
    3. 6.3 insertAdjacentHTML()
  8. 7 Extensions to the Text interface
  9. 8 Extensions to the Range interface
  10. References
  11. Acknowledgements

Issues

Various issues are listed in the rest of the document.

This specification currently requires using the XML Parser for some APIs, when in an XML document. It is unclear whether consensus can be found for this approach.

1 Conformance

All diagrams, examples, and notes in this specification are non-normative, as are all sections explicitly marked non-normative. Everything else in this specification is normative.

The key words "MUST", "MUST NOT", "REQUIRED", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in the normative parts of this document are to be interpreted as described in RFC2119. For readability, these words do not appear in all uppercase letters in this specification. [RFC2119]

Requirements phrased in the imperative as part of algorithms (such as "strip any leading space characters" or "return false and abort these steps") are to be interpreted with the meaning of the key word ("must", "should", "may", etc) used in introducing the algorithm.

Conformance requirements phrased as algorithms or specific steps may be implemented in any manner, so long as the end result is equivalent. (In particular, the algorithms defined in this specification are intended to be easy to follow, and not intended to be performant.)

User agents may impose implementation-specific limits on otherwise unconstrained inputs, e.g. to prevent denial of service attacks, to guard against running out of memory, or to work around platform-specific limitations.

When a method or an attribute is said to call another method or attribute, the user agent must invoke its internal API for that attribute or method so that e.g. the author can't change the behavior by overriding attributes or methods with custom properties or functions in ECMAScript.

Unless otherwise stated, string comparisons are done in a case-sensitive manner.

1.1 Dependencies

The IDL fragments in this specification must be interpreted as required for conforming IDL fragments, as described in the Web IDL specification. [WEBIDL]

Some of the terms used in this specification are defined in DOM4 and HTML. [DOM] [HTML]

1.2 Extensibility

Vendor-specific proprietary extensions to this specification are strongly discouraged. Authors must not use such extensions, as doing so reduces interoperability and fragments the user base, allowing only users of specific user agents to access the content in question.

If vendor-specific extensions are needed, the members should be prefixed by vendor-specific strings to prevent clashes with future versions of this specification. Extensions must be defined so that the use of extensions neither contradicts nor causes the non-conformance of functionality defined in the specification.

When vendor-neutral extensions to this specification are needed, either this specification can be updated accordingly, or an extension specification can be written that overrides the requirements in this specification. When someone applying this specification to their activities decides that they will recognise the requirements of such an extension specification, it becomes an applicable specification for the purposes of conformance requirements in this specification.

2 Terminology

The term context object means the object on which the method or attribute being discussed was called.

3 Parsing and serializing Nodes

3.1 Parsing

The following steps form the fragment parsing algorithm, whose arguments are a markup string and a context element.

  1. If the context element's node document is an HTML document: let algorithm be the HTML fragment parsing algorithm.

    If the context element's node document is an XML document: let algorithm be the XML fragment parsing algorithm.

  2. Invoke algorithm with markup as the input, and context element as the context element.

  3. If this raised an exception, then abort these steps.

  4. Let new children be the nodes returned.

  5. Let fragment be a new DocumentFragment whose node document is context element's node document.

  6. Append each node in new children to fragment (in order).

    This ensures the node document for the new nodes is correct.

  7. Return fragment.

3.2 Serializing

To produce an XML serialization of a Node node, the user agent must run the appropriate steps, depending on node's interface:

Element
Document

Run the XML fragment serialization algorithm on node. If this threw an exception, allow that exception to propagate out from this algorithm. Otherwise, return the returned string.

Comment

Let markup the concatenation of "<!--", node's data, and "-->".

If markup matches the Comment production, return markup. Otherwise, throw an INVALID_STATE_ERR exception.

Text

Let data be node's data.

If node has its serialize as CDATA flag set, run the following steps:

  1. If data doesn't match the CData production, throw an INVALID_STATE_ERR exception and terminate the entire algorithm.
  2. Let markup be the concatenation of "<![CDATA[", data, and "]]>".
  3. Return markup.

Otherwise, return data.

DocumentFragment

Let markup the empty string.

For each child of node, in order, produce an XML serialization of the child and concatenate the result to markup.

Return markup.

DocumentType
ProcessingInstruction
You tell me.

4 The DOMParser interface

[Constructor]
interface DOMParser {
  Document parseFromString(DOMString str, DOMString type);
};

The DOMParser() constructor must return a new DOMParser object.

The parseFromString(str, type) method must run these steps:

  1. If type is not "text/xml", "application/xml", "application/xhtml+xml" or "image/svg+xml", throw a NOT_SUPPORTED_ERR exception and terminate these steps.

  2. Parse str with a namespace-enabled XML parser.

  3. If the previous step didn't return an error, return the newly created document and terminate these steps.

  4. Let document be a newly-created XMLDocument.

  5. Let root be a new Element, with its local name set to "parsererror" and its namespace set to "http://www.mozilla.org/newlayout/xml/parsererror.xml".

    At this point user agents may append nodes to root, for example to describe the nature of the error.

  6. Append root to document.

  7. Return document.

5 The XMLSerializer interface

[Constructor]
interface XMLSerializer {
  DOMString serializeToString(Node root);
};

The XMLSerializer() constructor must return a new XMLSerializer object.

The serializeToString(root) method must produce an XML serialization of root and return the result.

6 Extensions to the Element interface

partial interface Element {
  attribute DOMString innerHTML;
  attribute DOMString outerHTML;
  void insertAdjacentHTML(DOMString position, DOMString text);
};

6.1 innerHTML

The innerHTML IDL attribute represents the markup of the Element's contents.

element . innerHTML [ = value ]

Returns a fragment of HTML or XML that represents the element's contents.

Can be set, to replace the contents of the element with nodes parsed from the given string.

In the case of an XML document, will throw an INVALID_STATE_ERR if the Element cannot be serialized to XML, and a SYNTAX_ERR if the given string is not well-formed.

On getting, if the context object's node document is an HTML document, then the attribute must return the result of running the HTML fragment serialization algorithm on the context object; otherwise, the context object's node document is an XML document, and the attribute must return the result of running the XML fragment serialization algorithm on the context object instead (this might raise an exception instead of returning a string).

On setting, the following steps must be run:

  1. Let fragment be the result of invoking the fragment parsing algorithm with the given value as markup, and the context object as the context element.

    If this raised an exception, then abort these steps.

  2. While the context object has children, remove its first child.

  3. Append fragment to the context object.

6.2 outerHTML

The outerHTML IDL attribute represents the markup of the Element and its contents.

element . outerHTML [ = value ]

Returns a fragment of HTML or XML that represents the element and its contents.

Can be set, to replace the element with nodes parsed from the given string.

In the case of an XML document, will throw an INVALID_STATE_ERR if the element cannot be serialized to XML, and a SYNTAX_ERR if the given string is not well-formed.

Throws a NO_MODIFICATION_ALLOWED_ERR exception if the parent of the element is the Document node.

On getting, if the context object's node document is an HTML document, then the attribute must return the result of running the HTML fragment serialization algorithm on a fictional node whose only child is context object; otherwise, the context object's node document is an XML document, and the attribute must return the result of running the XML fragment serialization algorithm on that fictional node instead (this might raise an exception instead of returning a string).

On setting, the following steps must be run:

  1. Let parent be the context object's parent.

  2. If parent is null, abort these steps. There would be no way to obtain a reference to the nodes created even if the remaining steps were run.

  3. If parent is a Document, throw a NO_MODIFICATION_ALLOWED_ERR exception and abort these steps.

  4. If parent is a DocumentFragment, let parent be a new Element with

  5. Let fragment be the result of invoking the fragment parsing algorithm with the given value as markup, and parent as the context element.

    If this raised an exception, then abort these steps.

  6. Replace the context object with fragment within the context object's parent.

6.3 insertAdjacentHTML()

element . insertAdjacentHTML(position, text)

Parses the given string text as HTML or XML and inserts the resulting nodes into the tree in the position given by the position argument, as follows:

"beforebegin"
Before the element itself.
"afterbegin"
Just inside the element, before its first child.
"beforeend"
Just inside the element, after its last child.
"afterend"
After the element itself.

Throws a SYNTAX_ERR exception if the arguments have invalid values (e.g., in the case of an XML document, if the given string is not well-formed).

Throws a NO_MODIFICATION_ALLOWED_ERR exception if the given position isn't possible (e.g. inserting elements after the root element of a Document).

The insertAdjacentHTML(position, text) method must run these steps:

  1. Use the first matching item from this list:

    If position is an ASCII case-insensitive match for the string "beforebegin"
    If position is an ASCII case-insensitive match for the string "afterend"

    Let context be the context object's parent.

    If context is null or a document, throw a NO_MODIFICATION_ALLOWED_ERR and abort these steps.

    If position is an ASCII case-insensitive match for the string "afterbegin"
    If position is an ASCII case-insensitive match for the string "beforeend"

    Let context be the context object.

    Otherwise

    Throw a SYNTAX_ERR exception.

  2. If context is not an Element or the following are all true:

    let context be a new Element with

  3. Let fragment be the result of invoking the fragment parsing algorithm with text as markup, and parent as the context element.

    If this raised an exception, then abort these steps.

  4. Use the first matching item from this list:

    If position is an ASCII case-insensitive match for the string "beforebegin"

    Insert fragment into the context object's parent before the context object.

    If position is an ASCII case-insensitive match for the string "afterbegin"

    Insert fragment into the context object before its first child.

    If position is an ASCII case-insensitive match for the string "beforeend"

    Append fragment to the context object.

    If position is an ASCII case-insensitive match for the string "afterend"

    Insert fragment into the context object's parent before the context object's next sibling.

7 Extensions to the Text interface

partial interface Text {
  attribute boolean serializeAsCDATA;
};
text . serializeAsCDATA [ = value ]
Controls whether, in XML, this node is serialized as a CDATA section.

Text nodes have an additional associated flag, the serialize as CDATA flag.

The serializeAsCDATA attribute must return true if the context object has its serialize as CDATA flag set, or false otherwise.

Setting the serializeAsCDATA attribute must, if the new value is true, set the context object's serialize as CDATA flag, or unset it otherwise.

8 Extensions to the Range interface

partial interface Range {
  DocumentFragment createContextualFragment(DOMString fragment);
};
fragment = range . createContextualFragment(fragment)

Returns a DocumentFragment, created from the markup string given.

The createContextualFragment(fragment) method must run these steps:

  1. If the context object's detached flag is set, throw an INVALID_STATE_ERR exception and terminate these steps.

  2. Let node the context object's start node.

    Let element be as follows, depending on node's interface:

    Document
    DocumentFragment
    null
    Element
    node
    Text
    Comment
    node's parent element
    DocumentType
    ProcessingInstruction
    DOM4 prevents this case. [DOM]
  3. If either element is null or the following are all true:

    let element be a new element with

  4. Let fragment node be the result of invoking the fragment parsing algorithm with fragment as markup, and element as the context element.

    If this raised an exception, then abort these steps.

  5. Unmark all scripts in fragment node as "already started".

  6. Return fragment node.

References

All references are normative unless marked "Non-normative".

[DOM]
DOM4, Anne van Kesteren, Aryeh Gregor and Ms2ger. W3C.
[HTML]
HTML, Ian Hickson. WHATWG.
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels, Scott Bradner. IETF.
[WEBIDL]
Web IDL, Cameron McCormack. W3C.

Acknowledgements

Thanks to Anne van Kesteren, Aryeh Gregor, Henri Sivonen and timeless for their useful comments.

Special thanks to Ian Hickson for defining the innerHTML and outerHTML attributes, and the insertAdjacentHTML() method in HTML and his useful comments. [HTML]