초록

이 명세는 웹 애플리케이션이 DOM 노드를 구문 분석하고 직렬화하는 데 사용할 수 있도록 HTML 및 범용 XML 파서에 프로그래밍 방식으로 접근하기 위한 다양한 API를 정의한다.

이 문서의 상태

이 절은 이 문서가 공개된 시점에서의 상태를 설명한다. 다른 문서가 이 문서를 대체할 수 있다. 현재 W3C 공개 문서 목록과 이 기술 보고서의 최신 개정판은 W3C 기술 보고서 색인(http://www.w3.org/TR/)에서 확인할 수 있다.

이 명세는 DOM Parsing and Serialization 살아있는 명세의 원래 작업을 기반으로 하지만, 지원되는 기능, 규범적 요구 사항, 알고리즘 구체성 측면에서는 달라졌다. 적절한 경우, 살아있는 명세의 관련 수정 사항이 이 문서에 통합된다.

이 문서는 Web Platform Working Group이 작업 초안으로 공개했다. 이 문서는 W3C 권고안이 되는 것을 목표로 한다. 이 문서에 대한 의견을 보내려면 www-dom@w3.org (구독, 아카이브)로 보내고, 이메일 제목의 시작 부분에 DOM-Parsing을 포함해 달라. 모든 의견을 환영한다.

작업 초안으로 공개되었다고 해서 W3C 회원의 승인을 의미하지는 않는다. 이 문서는 초안 문서이며, 언제든 다른 문서로 업데이트, 대체 또는 폐기될 수 있다. 이 문서를 진행 중인 작업이 아닌 것으로 인용하는 것은 부적절하다.

이 문서는 2004년 2월 5일 W3C 특허 정책에 따라 운영되는 그룹이 작성했다. W3C는 해당 그룹의 산출물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 유지한다. 해당 페이지에는 특허 공개를 위한 지침도 포함되어 있다. 해당 개인이 필수 청구항을 포함한다고 믿는 특허에 대해 실제 지식을 가진 개인은 W3C 특허 정책의 6절에 따라 그 정보를 공개해야 한다.

이 문서는 2015년 9월 1일 W3C 프로세스 문서의 적용을 받는다.

후보 권고안 종료 기준

이 명세는 명세의 테스트 스위트가 완료되고 둘 이상의 독립 구현이 각 테스트를 통과하기 전에는 제안 권고안으로 진행하지 않는다. 단일 구현이 모든 테스트를 통과해야 하는 것은 아니다. 이 기준은 2014년 10월 24일보다 이르게 충족되지는 않을 것으로 예상한다. 그룹은 또한 구현 보고서를 작성할 것이다.

1. 적합성

비규범적이라고 표시된 절뿐만 아니라, 이 명세의 모든 저작 지침, 도표, 예제, 및 참고 사항은 비규범적이다. 이 명세의 그 밖의 모든 것은 규범적이다.

알고리즘의 일부로 명령형으로 표현된 요구 사항 (예: "선행 공백 문자를 모두 제거한다" 또는 "false를 반환하고 이 단계를 종료한다")은 해당 알고리즘을 도입하는 데 사용된 핵심 단어("must", "should", "may" 등)의 의미로 해석해야 한다.

알고리즘 또는 특정 단계로 표현된 적합성 요구 사항은 최종 결과가 동등하기만 하면 어떤 방식으로든 구현할 수 있다. (특히 이 명세에 정의된 알고리즘은 따라가기 쉽게 의도된 것이며, 성능을 고려해 의도된 것은 아니다.)

사용자 에이전트는 예를 들어 서비스 거부 공격을 방지하거나, 메모리 부족을 막거나, 플랫폼별 제한을 우회하기 위해, 달리 제한되지 않은 입력에 구현별 제한을 부과할 수 있다.

메서드 또는 속성이 다른 메서드 또는 속성을 호출한다고 말하는 경우, 사용자 에이전트는 그 속성 또는 메서드에 대한 내부 API를 호출해야 하며, 예를 들어 작성자가 ECMAScript에서 사용자 지정 속성이나 함수로 속성 또는 메서드를 재정의하여 동작을 변경할 수 없도록 해야 한다.

달리 명시하지 않는 한, 문자열 비교는 대소문자를 구분하는 방식으로 수행된다.

알고리즘이 다른 알고리즘을 호출하는 경우, 후자에서 던져진 모든 예외는(명시적으로 잡히지 않는 한) 전자를 종료시키고, 그 예외가 호출자에게 전파되도록 해야 한다.

1.1 의존성

이 명세의 IDL 조각은 Web IDL 명세에 설명된 적합 IDL 조각에 요구되는 대로 해석해야 한다. [WEBIDL]

이 명세에서 사용되는 일부 용어는 [DOM4], [HTML5], 및 [XML10]에 정의되어 있다.

1.2 확장성

이 명세에 대한 벤더별 독점 확장은 강하게 권장되지 않는다. 작성자는 이러한 확장을 사용해서는 안 된다. 그렇게 하면 상호운용성이 저하되고 사용자 기반이 분열되어, 특정 사용자 에이전트의 사용자만 해당 콘텐츠에 접근할 수 있게 되기 때문이다.

벤더별 확장이 필요한 경우, 향후 이 명세의 버전과의 충돌을 방지하기 위해 구성원에는 벤더별 문자열을 접두사로 붙여야 한다. 확장은 확장의 사용이 이 명세에 정의된 기능과 모순되거나 그 기능을 부적합하게 만들지 않도록 정의해야 한다.

이 명세에 대한 벤더 중립적 확장이 필요한 경우, 이 명세를 그에 맞게 업데이트하거나, 이 명세의 요구 사항을 재정의하는 확장 명세를 작성할 수 있다. 어떤 사람이 자신의 활동에 이 명세를 적용할 때 그러한 확장 명세의 요구 사항을 인정하기로 결정하면, 그것은 이 명세의 적합성 요구 사항의 목적상 적용 가능한 명세가 된다.

2. 용어

컨텍스트 객체라는 용어는 논의 중인 메서드 또는 속성이 호출된 객체를 의미한다.

3. 네임스페이스

HTML 네임스페이스http://www.w3.org/1999/xhtml이다.

XML 네임스페이스http://www.w3.org/XML/1998/namespace이다.

XMLNS 네임스페이스http://www.w3.org/2000/xmlns/이다.

4. Node 구문 분석 및 직렬화

4.1 구문 분석

다음 단계는 조각 구문 분석 알고리즘을 구성하며, 그 인수는 markup 문자열과 context element이다.

  1. context element노드 문서HTML 문서인 경우: algorithmHTML 조각 구문 분석 알고리즘으로 둔다.

    context element노드 문서XML 문서인 경우: algorithmXML 조각 구문 분석 알고리즘으로 둔다.

  2. new childrenmarkupinput으로, context elementcontext 요소로 하여 algorithm을 호출한 결과로 둔다.
  3. fragment를 새 DocumentFragment로 두며, 그 노드 문서context element노드 문서이다.
  4. new children 안의 각 노드fragment에 (트리 순서로) 추가한다.
    참고

    이는 새 노드 문서노드에 대해 올바르도록 보장한다.

  5. fragment의 값을 반환한다.

4.2 직렬화

다음 단계는 조각 직렬화 알고리즘을 구성하며, 그 인수는 Node node와 플래그 well-formed 요구이다.

  1. context documentnode노드 문서 값으로 둔다.
  2. context documentHTML 문서이면, nodeHTML 직렬화를 반환한다.
  3. 그렇지 않으면, context documentXML 문서이다. 플래그 require well-formed를 전달하여 nodeXML 직렬화를 반환한다.
    참고

    이 문서에 정의된 XML 직렬화는 [HTML5]에 정의된 XML 조각 직렬화 알고리즘의 요구 사항을 따른다.

Node nodeHTML 직렬화를 생성하려면, 사용자 에이전트는 node에 대해 HTML 조각 직렬화 알고리즘 [HTML5]을 실행하고 생성된 문자열을 반환해야 한다.

Node nodeXML 직렬화를 플래그 require well-formed가 주어진 상태에서 생성하려면, 다음 단계를 실행한다.

  1. 컨텍스트 네임스페이스null로 둔다. 컨텍스트 네임스페이스node가 부모와 다른 기본 네임스페이스 정의를 직렬화할 때 변경된다. 이 알고리즘은 시작 시 네임스페이스가 없다고 가정한다.
  2. 네임스페이스 접두사 맵namespaceURI와 네임스페이스 prefix 쌍을 연결하기 위한 새 맵으로 둔다. 여기서 namespaceURI 값은 맵의 키이고, prefix 값은 맵의 키 값이다. 네임스페이스 접두사 맵은 하위 트리에 대해 이전에 나타난 namespaceURI와 그 가장 최근의 접두사 연결로 채워진다. 참고: 네임스페이스 접두사 맵은 주어진 namespaceURI에 대해 하나의 접두사 값만 연결한다. 직렬화 중 같은 namespaceURI에 매핑되는 다른 네임스페이스 접두사가 발견되면, 마지막으로 만난 것이 맵의 기존 키 값을 새 접두사 값으로 바꾸어 "이긴다".
  3. 네임스페이스 접두사 맵XML 네임스페이스 키와 문자열 "xml"을 키 값으로 하여 초기화한다.
  4. 생성된 네임스페이스 접두사 인덱스를 값이 1인 정수로 둔다. 생성된 네임스페이스 접두사 인덱스node의 namespaceURI(또는 node의 속성 중 하나의 namespaceURI)를 직렬화하는 데 적절한 기존 네임스페이스 접두사를 사용할 수 없을 때 새 고유 접두사 값을 생성하는 데 사용된다. 접두사 생성 알고리즘을 보라.
  5. node에 대해 컨텍스트 네임스페이스, 네임스페이스 접두사 맵, 생성된 네임스페이스 접두사 인덱스 참조 및 플래그 require well-formed를 전달하여 XML 직렬화 알고리즘을 실행한 결과를 반환한다. 알고리즘 실행 중 예외가 발생하면, 그 예외를 잡고 이름이 "InvalidStateError"인 DOMException을 던진다.

XML 직렬화는 다음과 같은 방식에서 HTML 직렬화와 다르다.

그 밖의 경우, XML 직렬화를 생성하는 알고리즘은 HTML 파서와 호환되는 직렬화를 생성하도록 설계되어 있다. 예를 들어, 자식 노드를 포함하지 않는 HTML 네임스페이스의 요소는 자체 닫힘 태그 구문을 사용하지 않고 명시적인 시작 태그와 종료 태그로 직렬화된다 [XML10].

참고

[DOM4]에 따르면, Attr 객체는 Node를 상속하지 않으므로 XML 직렬화 알고리즘으로 직렬화할 수 없다. Attr 객체를 직렬화하려고 시도하면 TypeError 예외가 발생한다 [WEBIDL].

node에 대해 컨텍스트 네임스페이스 namespace, 네임스페이스 접두사 맵 prefix map, 생성된 네임스페이스 접두사 인덱스 prefix index, 및 플래그 require well-formed가 주어진 상태에서 XML 직렬화 알고리즘을 실행하려면, 사용자 에이전트는 node의 인터페이스에 따라 적절한 단계를 실행해야 한다.

Element

다음 알고리즘을 실행한다.

  1. require well-formed 플래그가 설정되어 있고(그 값이 true), 이 nodelocalName 속성이 문자 ":"(U+003A COLON)를 포함하거나 XML Name 생성식 [XML10]과 일치하지 않으면, 예외를 던진다. 이 node의 직렬화는 well-formed 요소가 되지 않는다.
  2. markup을 문자열 "<"(U+003C LESS-THAN SIGN)로 둔다.
  3. qualified name을 빈 문자열로 둔다.
  4. skip end tag 플래그의 값을 false로 둔다.
  5. ignore namespace definition attribute 플래그의 값을 false로 둔다.
  6. mapprefix map의 복사본으로 둔다.
  7. element prefixes list를 빈 목록으로 둔다. 이 목록은 각 요소에 로컬이다. 그 목적은 새 네임스페이스 접두사 속성을 생성해야 할 때 충돌하는 접두사가 없도록 보장하는 것이다.
  8. duplicate prefix definitionnull로 둔다.
  9. local default namespacemap, element prefixes list, 및 duplicate prefix definition이 주어진 node에 대해 네임스페이스 정보 기록을 수행한 결과로 둔다.
    참고

    위 단계는 발견된 모든 네임스페이스 접두사 정의로 map을 업데이트하고, 발견된 접두사 정의를 element prefixes list에 추가하며, 선택적으로 duplicate prefix definition 값을 설정하고, 기본 네임스페이스 속성이 존재하면 그 속성이 정의한 로컬 기본 네임스페이스 값을 반환한다. 그렇지 않으면 null을 반환한다.

  10. inherited nsnamespace의 복사본으로 둔다.
  11. nsnodenamespaceURI 속성 값으로 둔다.
  12. inherited nsns와 같으면:
    1. local default namespacenull이 아니면, ignore namespace definition attributetrue로 설정한다.
    2. nsXML 네임스페이스이면, qualified name을 문자열 "xml:"와 nodelocalName 값의 연결로 둔다.
    3. 그렇지 않으면, qualified namenodelocalName 속성 값으로 둔다. node의 접두사는 항상 삭제된다.
    4. qualified name의 값을 markup에 추가한다.
  13. 그렇지 않으면, inherited nsns와 같지 않다 (node 자신의 네임스페이스가 그 부모의 컨텍스트 네임스페이스와 다르다). 다음 하위 단계를 실행한다.
    1. prefixnodeprefix 속성 값으로 둔다.
    2. candidate prefixns의 값과 일치하는 키가 map에 존재하는 경우 map의 값으로 두고, 그러한 키가 없으면 candidate prefixnull로 둔다.
    3. candidate prefixnull이 아니면 (ns에 매핑되는 적절한 네임스페이스 접두사가 정의되어 있으면):
      1. qualified namecandidate prefix, ":"(U+003A COLON), 및 node localName의 연결로 둔다. node 또는 node의 조상에는 node의 네임스페이스를 정의하는 네임스페이스 접두사 정의가 존재한다.
      2. local default namespacenull이 아니면 (로컬로 정의된 기본 네임스페이스 선언 속성이 존재하면), inherited nsns의 값을 갖게 한다.
      3. qualified name의 값을 markup에 추가한다.
    4. 그렇지 않고, prefixnull이 아니고 local default namespacenull이면:
      1. element prefixes listprefix의 값을 포함하면, prefix접두사 생성의 결과로 둔다. 이때 입력으로 네임스페이스 접두사 맵 map, nodens 문자열, 및 prefix index 정수를 제공한다.
      2. 그렇지 않으면, map에 새 키 ns를 추가하고 그 키 값은 prefix로 한다.
      3. qualified nameprefix, ":"(U+003A COLON), 및 nodelocalName의 연결로 둔다.
      4. qualified name의 값을 markup에 추가한다.
      5. 다음을 나열된 순서대로 markup에 추가한다. 다음은 방금 map에 추가된 새 네임스페이스/접두사 연결을 직렬화한다.
        1. " " (U+0020 SPACE);
        2. 문자열 "xmlns:";
        3. prefix의 값;
        4. "="" (U+003D EQUALS SIGN, U+0022 QUOTATION MARK);
        5. nsrequire well-formed 플래그를 입력으로 주어 속성 값 직렬화를 수행한 결과;
        6. """ (U+0022 QUOTATION MARK).
    5. 그렇지 않고, local default namespacenull이거나, local default namespacenull이 아니고 그 값이 ns와 같지 않으면:
      1. ignore namespace definition attribute 플래그를 true로 설정한다.
      2. qualified namenodelocalName 속성 값으로 둔다.
      3. inherited ns의 값을 ns로 둔다. 새 기본 네임스페이스는 직렬화에서 이 node의 네임스페이스를 정의하고 그 자식의 컨텍스트 네임스페이스로 작동하는 데 사용된다.
      4. qualified name의 값을 markup에 추가한다.
      5. 다음을 나열된 순서대로 markup에 추가한다. 다음은 새(또는 대체) 기본 네임스페이스 정의를 직렬화한다.
        1. " " (U+0020 SPACE);
        2. 문자열 "xmlns";
        3. "="" (U+003D EQUALS SIGN, U+0022 QUOTATION MARK);
        4. nsrequire well-formed 플래그를 입력으로 주어 속성 값 직렬화를 수행한 결과;
        5. """ (U+0022 QUOTATION MARK).
    6. 그렇지 않으면, nodens와 일치하는 local default namespace를 가진다. qualified namenodelocalName 값으로 두고, inherited ns의 값을 ns로 두며, qualified name의 값을 markup에 추가한다.
  14. map네임스페이스 접두사 맵, prefix index생성된 접두사 인덱스, 플래그 ignore namespace definition attributeduplicate prefix definition의 값이 주어진 node 속성의 XML 직렬화 결과를 markup에 추가한다.
  15. nsHTML 네임스페이스이고, node자식 목록이 비어 있으며, nodelocalName이 다음 void 요소 중 하나와 일치하면: "area", "base", "basefont", "bgsound", "br", "col", "embed", "frame", "hr", "img", "input", "keygen", "link", "menuitem", "meta", "param", "source", "track", "wbr"; 그런 다음 다음을 나열된 순서대로 markup에 추가한다.
    1. " " (U+0020 SPACE);
    2. "/" (U+002F SOLIDUS).
    그리고 skip end tag 플래그를 true로 설정한다.
  16. nsHTML 네임스페이스가 아니고, node자식 목록이 비어 있으면, "/"(U+002F SOLIDUS)를 markup에 추가하고 skip end tag 플래그를 true로 설정한다.
  17. ">"(U+003E GREATER-THAN SIGN)를 markup에 추가한다.
  18. skip end tag의 값이 true이면, markup의 값을 반환하고 나머지 단계를 건너뛴다. node는 리프 노드이다.
  19. nsHTML 네임스페이스이고, nodelocalName이 문자열 "template"과 일치하면, 이는 template 요소이다. template 요소의 template 콘텐츠 ( DocumentFragment)에 대해 컨텍스트 네임스페이스에는 inherited ns의 값을 제공하고, 네임스페이스 접두사 맵에는 map을 제공하며, 생성된 네임스페이스 접두사 인덱스에는 prefix index를 제공하고, require well-formed 플래그의 값을 제공하여 XML 직렬화 알고리즘을 실행한 결과를 markup에 추가한다. 이는 XHTML 문서 구문 분석 [HTML5]의 규칙이 주어졌을 때, template 콘텐츠가 왕복할 수 있도록 한다.
  20. 그렇지 않으면, node의 각 자식에 대해 트리 순서로, 컨텍스트 네임스페이스에는 inherited ns의 값을 제공하고, 네임스페이스 접두사 맵에는 map을 제공하며, 생성된 네임스페이스 접두사 인덱스에는 prefix index를 제공하고, require well-formed 플래그의 값을 제공하여 XML 직렬화 알고리즘을 실행한 결과를 markup에 추가한다.
  21. 다음을 나열된 순서대로 markup에 추가한다.
    1. "</" (U+003C LESS-THAN SIGN, U+002F SOLIDUS);
    2. qualified name의 값;
    3. ">" (U+003E GREATER-THAN SIGN).
  22. markup의 값을 반환한다.
Document

require well-formed 플래그가 설정되어 있고(그 값이 true), 이 nodedocumentElement가 없으면 ( documentElement 속성의 값이 null이면), 예외를 던진다. 이 node의 직렬화는 well-formed 문서가 되지 않는다.

그렇지 않으면, 다음 단계를 실행한다.

  1. serialized document를 빈 문자열로 둔다.
  2. nodedoctype 속성이 null이 아니면, require well-formed 플래그가 제공된 nodedoctype 속성의 DocumentType 직렬화 생성 단계를 실행하여 생성된 문자열을 serialized document에 추가한다.
  3. node의 각 자식 child에 대해 트리 순서로, 컨텍스트 네임스페이스 namespace, 네임스페이스 접두사 맵 prefix map, 생성된 네임스페이스 접두사 인덱스 prefix index에 대한 참조, 플래그 require well-formed가 주어진 child에 대해 XML 직렬화 알고리즘을 실행하고, 그 결과를 serialized document에 추가한다.
  4. serialized document의 값을 반환한다.
Comment

require well-formed 플래그가 설정되어 있고(그 값이 true), nodedata가 XML Char 생성식 [XML10]과 일치하지 않는 문자를 포함하거나, "--"(인접한 두 U+002D HYPHEN-MINUS 문자)를 포함하거나, "-"(U+002D HYPHEN-MINUS) 문자로 끝나면, 예외를 던진다. 이 nodedata 직렬화는 well-formed가 되지 않는다.

"<!--", nodedata, 및 "-->"의 연결을 반환한다.

Text
  1. require well-formed 플래그가 설정되어 있고(그 값이 true), nodedata가 XML Char 생성식 [XML10]과 일치하지 않는 문자를 포함하면, 예외를 던진다. 이 nodedata 직렬화는 well-formed가 되지 않는다.
  2. markupnodedata 값으로 둔다.
  3. markup 안의 "&" 발생을 모두 "&amp;"로 바꾼다.
  4. markup 안의 "<" 발생을 모두 "&lt;"로 바꾼다.
  5. markup 안의 ">" 발생을 모두 "&gt;"로 바꾼다.
  6. markup의 값을 반환한다.
DocumentFragment
  1. markup을 빈 문자열로 둔다.
  2. node의 각 자식 child에 대해 트리 순서로, 컨텍스트 네임스페이스 namespace, 네임스페이스 접두사 맵 prefix map, 생성된 네임스페이스 접두사 인덱스 prefix index에 대한 참조, 및 플래그 require well-formed가 주어진 child에 대해 XML 직렬화 알고리즘을 실행한다. 그 결과를 markup에 연결한다.
  3. markup의 값을 반환한다.
DocumentType
require well-formed 플래그가 주어진 nodeDocumentType 직렬화 생성 단계를 실행하고, 이것이 생성한 문자열을 반환한다.
ProcessingInstruction
  1. require well-formed 플래그가 설정되어 있고(그 값이 true), nodetarget이 ":"(U+003A COLON) 문자를 포함하거나 문자열 "xml"과 ASCII 대소문자 구분 없는 일치이면, 예외를 던진다. 이 nodetarget 직렬화는 well-formed가 되지 않는다.
  2. require well-formed 플래그가 설정되어 있고(그 값이 true), nodedata가 XML Char 생성식 [XML10]과 일치하지 않는 문자를 포함하거나 문자열 "?>"(U+003F QUESTION MARK, U+003E GREATER-THAN SIGN)를 포함하면, 예외를 던진다. 이 nodedata 직렬화는 well-formed가 되지 않는다.
  3. markup을 다음을 나열된 순서대로 연결한 것으로 둔다.
    1. "<?" (U+003C LESS-THAN SIGN, U+003F QUESTION MARK);
    2. nodetarget 값;
    3. " " (U+0020 SPACE);
    4. nodedata 값;
    5. "?>" (U+003F QUESTION MARK, U+003E GREATER-THAN SIGN).
  4. markup의 값을 반환한다.

Node nodeDocumentType 직렬화 생성을, require well-formed 플래그가 주어진 상태에서 수행하려면, 사용자 에이전트는 다음 알고리즘의 결과를 반환해야 한다.

  1. require well-formed 플래그가 true이고, nodepublicId 속성이 XML PubidChar 생성식 [XML10]과 일치하지 않는 문자를 포함하면, 예외를 던진다. 이 node의 직렬화는 well-formed 문서 타입 선언이 되지 않는다.
  2. require well-formed 플래그가 true이고 nodesystemId 속성이 XML Char 생성식 [XML10]과 일치하지 않는 문자를 포함하거나, """(U+0022 QUOTATION MARK)와 "'" (U+0027 APOSTROPHE)를 모두 포함하면, 예외를 던진다. 이 node의 직렬화는 well-formed 문서 타입 선언이 되지 않는다.
  3. markup을 빈 문자열로 둔다.
  4. 문자열 "<!DOCTYPE"을 markup에 추가한다.
  5. " "(U+0020 SPACE)를 markup에 추가한다.
  6. nodename 속성 값을 markup에 추가한다. HTML 문서에 속한 node의 경우, 그 값은 모두 소문자이다.
  7. nodepublicId가 빈 문자열이 아니면, 다음을 나열된 순서대로 markup에 추가한다.
    1. " " (U+0020 SPACE);
    2. 문자열 "PUBLIC";
    3. " " (U+0020 SPACE);
    4. """ (U+0022 QUOTATION MARK);
    5. nodepublicId 속성 값;
    6. """ (U+0022 QUOTATION MARK).
  8. nodesystemId가 빈 문자열이 아니고 nodepublicId가 빈 문자열로 설정되어 있으면, 다음을 나열된 순서대로 markup에 추가한다.
    1. " " (U+0020 SPACE);
    2. 문자열 "SYSTEM".
  9. nodesystemId가 빈 문자열이 아니면, 다음을 나열된 순서대로 markup에 추가한다.
    1. " " (U+0020 SPACE);
    2. """ (U+0022 QUOTATION MARK);
    3. nodesystemId 속성 값;
    4. """ (U+0022 QUOTATION MARK).
  10. ">"(U+003E GREATER-THAN SIGN)를 markup에 추가한다.
  11. markup의 값을 반환한다.

Element element에 대해 네임스페이스 접두사 맵 map, element prefixes list(초기에는 비어 있음), 및 duplicate prefix definition 참조가 주어진 상태에서 네임스페이스 정보 기록을 수행하려면, 사용자 에이전트는 다음 단계를 실행해야 한다.

  1. default namespace attr valuenull로 둔다.
  2. Main: elementattributes 안의 각 속성 attr에 대해, element속성 목록에 지정된 순서대로:
    참고

    다음 조건부 단계는 네임스페이스 접두사를 element prefixes list에 추가하고 map에 추가하거나 대체한다. XMLNS 네임스페이스의 속성만 고려된다(예를 들어, setAttribute("xmlns:pretend-prefix", "pretend-namespace")를 통해 네임스페이스 선언처럼 보이게 만든 속성은 포함되지 않는다).

    1. attribute namespaceattrnamespaceURI 값으로 둔다.
    2. attribute prefixattrprefix 값으로 둔다.
    3. attribute namespaceXMLNS 네임스페이스이면:
      1. attribute prefixnull이면, attr는 기본 네임스페이스 선언이다. default namespace attr valueattrvalue로 설정하고 이 단계 실행을 중지한 다음, 다음 속성을 방문하기 위해 Main으로 돌아간다.
      2. 그렇지 않으면, attribute prefixnull이 아니고 attr는 네임스페이스 접두사 정의이다. 다음 단계를 실행한다.
        1. prefix definitionattrlocalName 값으로 둔다.
        2. namespace definitionattrvalue 값으로 둔다.
        3. namespace definition 값과 일치하는 키가 map에 이미 존재하고, 그 키의 값이 prefix definition과 일치하면, 이는 중복 네임스페이스 접두사 정의이다. duplicate prefix definition의 값을 prefix definition으로 설정한다.
        4. 그렇지 않고, namespace definition 값과 일치하는 키가 map에 이미 존재하지만, 그 키의 값이 prefix definition과 일치하지 않으면, 그 키의 값을 prefix definition이 되도록 업데이트한다.
        5. 그렇지 않으면, namespace definition 값과 일치하는 키가 존재하지 않는다. map에 새 키 namespace definition을 추가하고 그 키 값은 prefix definition으로 한다.
        6. prefix definition의 값을 element prefixes list에 추가한다.
  3. default namespace attr value의 값을 반환한다.

네임스페이스 접두사 맵 map, 문자열 new namespace, 및 생성된 네임스페이스 접두사 인덱스 prefix index에 대한 참조가 주어진 상태에서 접두사를 생성하려면, 사용자 에이전트는 다음 단계를 실행해야 한다.

  1. generated prefix를 문자열 "ns"와 prefix index의 현재 숫자 값의 연결로 둔다.
  2. prefix index의 값을 1 증가시킨다.
  3. map에 새 키 new namespace를 추가하고, 그 키 값은 generated prefix로 한다.
  4. generated prefix의 값을 반환한다.

Element element속성의 XML 직렬화네임스페이스 접두사 맵 map, 생성된 접두사 인덱스 prefix index 참조, 플래그 ignore namespace definition attribute, duplicate prefix definition 값, 및 플래그 require well-formed와 함께 다음 알고리즘의 결과이다.

  1. result를 빈 문자열로 둔다.
  2. localname set를 새 빈 네임스페이스 localname 집합으로 둔다. 이 localname set는 고유한 속성 namespaceURIlocalName 쌍의 튜플을 포함하며, 각 attr가 처리될 때 채워진다. 이 집합은 요소가 같은 namespaceURIlocalName을 가진 두 속성을 가질 수 없다는 well-formed 제약을 [선택적으로] 강제하는 데 사용된다. 이는 같은 요소 위의 서로 동일한 두 속성이 접두사 값만 다른 경우 발생할 수 있다.
  3. Main: elementattributes 안의 각 속성 attr에 대해, element속성 목록에 지정된 순서대로:
    1. require well-formed 플래그가 설정되어 있고(그 값이 true), localname setattrnamespaceURI 속성과 localName 속성으로 구성된 새 튜플의 값과 일치하는 값을 가진 튜플을 포함하면, 예외를 던진다. 이 attr의 직렬화는 well-formed 요소 직렬화를 생성하지 못한다.
    2. attrnamespaceURI 속성과 localName 속성으로 구성된 새 튜플을 만들고, 이를 localname set에 추가한다.
    3. attribute namespaceattrnamespaceURI 값으로 둔다.
    4. candidate prefixnull로 둔다.
    5. attribute namespacenull이 아니면, 다음 하위 단계를 실행한다.
      1. attribute namespace의 값이 XMLNS 네임스페이스이고, attrprefixnull이고 ignore namespace definition attribute 플래그가 true이거나, attrprefixnull이 아니고 attrlocalNameduplicate prefix definition의 값과 일치하면, 이 단계 실행을 중지하고 다음 속성을 방문하기 위해 Main으로 이동한다.
      2. 그렇지 않고, attribute namespace의 값과 일치하는 키가 map에 존재하면, candidate prefixmap에 있는 그 키의 값으로 둔다.
      3. 그렇지 않으면, map에는 attribute namespace와 일치하는 키가 없고, attribute namespaceXMLNS 네임스페이스가 아니다. 다음 단계를 실행한다.
        1. candidate prefixmap, attribute namespace, 및 prefix index를 입력으로 제공하여 접두사 생성을 수행한 결과로 둔다.
        2. 다음을 나열된 순서대로 result에 추가한다.
          1. " " (U+0020 SPACE);
          2. 문자열 "xmlns:";
          3. candidate prefix의 값;
          4. "="" (U+003D EQUALS SIGN, U+0022 QUOTATION MARK);
          5. attribute namespacerequire well-formed 플래그를 입력으로 주어 속성 값 직렬화를 수행한 결과;
          6. """ (U+0022 QUOTATION MARK).
    6. " "(U+0020 SPACE)를 result에 추가한다.
    7. candidate prefixnull이 아니면, candidate prefix와 ":"(U+003A COLON)의 연결을 result에 추가한다.
    8. require well-formed 플래그가 설정되어 있고(그 값이 true), 이 attrlocalName 속성이 문자 ":"(U+003A COLON)를 포함하거나 XML Name 생성식 [XML10]과 일치하지 않거나, "xmlns"와 같고 attribute namespacenull이면, 예외를 던진다. 이 attr의 직렬화는 well-formed 속성이 되지 않는다.
    9. 다음 문자열을 나열된 순서대로 result에 추가한다.
      1. attrlocalName 값;
      2. "="" (U+003D EQUALS SIGN, U+0022 QUOTATION MARK);
      3. attrvalue 속성과 require well-formed 플래그를 입력으로 주어 속성 값 직렬화를 수행한 결과;
      4. """ (U+0022 QUOTATION MARK).
  4. result의 값을 반환한다.

attribute valuerequire well-formed 플래그가 주어진 상태에서 속성 값 직렬화를 하려면, 사용자 에이전트는 다음 단계를 실행해야 한다.

  1. require well-formed 플래그가 설정되어 있고(그 값이 true), attribute value가 XML Char 생성식 [XML10]과 일치하지 않는 문자를 포함하면, 예외를 던진다. 이 attribute value의 직렬화는 well-formed 요소 직렬화를 생성하지 못한다.
  2. attribute valuenull이면, 빈 문자열을 반환한다.
  3. 그렇지 않으면, attribute value는 문자열이다. 먼저 다음의 발생을 모두 바꾼 뒤, attribute value의 값을 반환한다.
    1. """를 "&quot;"로
    2. "&"를 "&amp;"로
    3. "<"를 "&lt;"로
    4. ">"를 "&gt;"로
    참고

    이는 브라우저에 존재하는 동작과 일치하며, ">" 문자도 대체함으로써 XML 명세의 AttValue 생성식 [XML10]의 문법 요구 사항을 넘어서는 동작이다.

5. DOMParser 인터페이스

enum SupportedType {
    "text/html",
    "text/xml",
    "application/xml",
    "application/xhtml+xml",
    "image/svg+xml"
};

DOMParser() 생성자는 새 DOMParser 객체를 반환해야 한다.

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

5.1 메서드

parseFromString

parseFromString(str, type) 메서드는 type에 따라 다음 단계를 실행해야 한다.

"text/html"

strHTML 파서로 구문 분석하고, 새로 생성된 문서를 반환한다.

스크립팅 플래그는 "disabled"로 설정되어야 한다.

참고

meta 요소는 사용되는 인코딩을 결정할 때 고려되지 않는다. Unicode 스트림이 파서에 전달되기 때문이다.

참고

script 요소는 실행 불가능으로 표시되고, noscript의 내용은 마크업으로 구문 분석된다.

"text/xml"
"application/xml"
"application/xhtml+xml"
"image/svg+xml"
  1. str을 네임스페이스가 활성화된 XML 파서로 구문 분석한다.
    참고

    XML 파서를 사용해 구문 분석된 모든 XHTML script 요소에 대해서는, 스크립팅 플래그에 해당하는 것이 "disabled"로 설정되어야 한다.

  2. 이전 단계가 오류를 반환하지 않았으면, 새로 생성된 문서를 반환한다.
  3. document를 새로 생성된 XML 문서로 둔다. documentXMLDocument 인터페이스가 아니라 Document 인터페이스를 사용한다.
  4. root를 새 Element로 두고, 그 로컬 이름은 "parsererror"로 설정하며, 그 네임스페이스는 "http://www.mozilla.org/newlayout/xml/parsererror.xml"로 설정한다.

    이 시점에서 사용자 에이전트는 예를 들어 오류의 성격을 설명하기 위해 노드를 root추가할 수 있다.

  5. rootdocument추가한다.
  6. document의 값을 반환한다.

어떤 경우든, 반환되는 문서콘텐츠 타입type 인수여야 한다. 또한, 문서URL 값이 활성 문서의 URL과 같아야 하며, location 값은 null이어야 한다.

참고

반환된 문서인코딩은 기본값인 UTF-8이다.

매개변수 타입 Null 가능 선택 사항 설명
str DOMString
type SupportedType
반환 타입: Document

6. XMLSerializer 인터페이스

XMLSerializer() 생성자는 새 XMLSerializer 객체를 반환해야 한다.

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

6.1 메서드

serializeToString
serializeToString(root) 메서드는 root의 XML 직렬화를 생성해야 하며, require well-formed 매개변수에는 false 값을 전달하고, 그 결과를 반환해야 한다.
매개변수 타입 Null 가능 선택 사항 설명
root Node
반환 타입: DOMString

7. Element 인터페이스에 대한 확장

partial interface Element {
    [CEReactions, TreatNullAs=EmptyString]
                    attribute DOMString innerHTML;
    [CEReactions, TreatNullAs=EmptyString]
                    attribute DOMString outerHTML;
    [CEReactions]
    void insertAdjacentHTML (DOMString position, DOMString text);
};

7.1 속성

innerHTML, 타입 DOMString

innerHTML IDL 속성은 Element의 콘텐츠 마크업을 나타낸다.

element . innerHTML [ = value ]

요소의 콘텐츠를 나타내는 HTML 또는 XML 조각을 반환한다.

설정할 수 있으며, 요소의 콘텐츠를 주어진 문자열에서 구문 분석된 노드로 대체한다.

XML 문서의 경우, Element를 XML로 직렬화할 수 없으면 이름이 "InvalidStateError"인 DOMException을 던지고, 주어진 문자열이 well-formed가 아니면 이름이 "SyntaxError"인 DOMException을 던진다.

가져올 때는 컨텍스트 객체에 대해 require well-formed 플래그에 true를 제공하여 조각 직렬화 알고리즘을 호출한 결과를 반환한다(문자열을 반환하는 대신 예외를 던질 수도 있다).

설정할 때는 다음 단계를 실행해야 한다.

  1. 새 값을 markup으로, 컨텍스트 객체context element로 하여 조각 구문 분석 알고리즘을 호출한 결과를 fragment로 둔다.
  2. 컨텍스트 객체 안에서 fragment모두 대체한다.
outerHTML, 타입 DOMString

outerHTML IDL 속성은 Element와 그 콘텐츠의 마크업을 나타낸다.

element . outerHTML [ = value ]

요소와 그 콘텐츠를 나타내는 HTML 또는 XML 조각을 반환한다.

설정할 수 있으며, 요소를 주어진 문자열에서 구문 분석된 노드로 대체한다.

XML 문서의 경우, 요소를 XML로 직렬화할 수 없으면 이름이 "InvalidStateError"인 DOMException을 던지고, 주어진 문자열이 well-formed가 아니면 이름이 "SyntaxError"인 DOMException을 던진다.

요소의 부모가 Document 노드이면, 이름이 "NoModificationAllowedError"인 DOMException을 던진다.

가져올 때는 컨텍스트 객체만을 자식으로 가진 가상의 노드에 대해 require well-formed 플래그에 true를 제공하여 조각 직렬화 알고리즘을 호출한 결과를 반환한다(문자열을 반환하는 대신 예외를 던질 수도 있다).

설정할 때는 다음 단계를 실행해야 한다.

  1. parent컨텍스트 객체부모로 둔다.
  2. parent가 null이면, 이 단계를 종료한다. 나머지 단계를 실행하더라도 생성된 노드에 대한 참조를 얻을 방법이 없다.
  3. parentDocument이면, 이름이 "NoModificationAllowedError"인 DOMException 예외를 던진다.
  4. parentDocumentFragment이면, parent를 다음을 가진 새 Element로 둔다.
  5. 새 값을 markup으로, parentcontext element로 하여 조각 구문 분석 알고리즘을 호출한 결과를 fragment로 둔다.
  6. 컨텍스트 객체부모 안에서 컨텍스트 객체fragment대체한다.

7.2 메서드

insertAdjacentHTML
element . insertAdjacentHTML(position, text)

주어진 문자열 text를 HTML 또는 XML로 구문 분석하고, 그 결과 노드를 position 인수가 지정한 위치의 트리에 다음과 같이 삽입한다.

"beforebegin"
요소 자체의 앞.
"afterbegin"
요소 바로 안쪽, 첫 번째 자식 앞.
"beforeend"
요소 바로 안쪽, 마지막 자식 뒤.
"afterend"
요소 자체의 뒤.

인수가 잘못된 값을 가지면(예: XML 문서의 경우, 주어진 문자열이 well-formed가 아니면), 이름이 "SyntaxError"인 DOMException을 던진다.

주어진 위치가 가능하지 않으면(예: Document의 루트 요소 뒤에 요소를 삽입하는 경우), 이름이 "NoModificationAllowedError"인 DOMException을 던진다.

insertAdjacentHTML(position, text) 메서드는 다음 단계를 실행해야 한다.

  1. 이 목록에서 처음 일치하는 항목을 사용한다.
    position이 문자열 "beforebegin"과 ASCII 대소문자 구분 없는 일치인 경우
    position이 문자열 "afterend"와 ASCII 대소문자 구분 없는 일치인 경우

    context컨텍스트 객체부모로 둔다.

    context가 null이거나 문서이면, 이름이 "NoModificationAllowedError"인 DOMException을 던진다.

    position이 문자열 "afterbegin"과 ASCII 대소문자 구분 없는 일치인 경우
    position이 문자열 "beforeend"와 ASCII 대소문자 구분 없는 일치인 경우
    context컨텍스트 객체로 둔다.
    그렇지 않으면

    이름이 "SyntaxError"인 DOMException을 던진다.

  2. contextElement가 아니거나, 다음이 모두 참이면:

    context를 다음을 가진 새 Element로 둔다.

  3. textmarkup으로, contextcontext element로 하여 조각 구문 분석 알고리즘을 호출한 결과를 fragment로 둔다.
  4. 이 목록에서 처음 일치하는 항목을 사용한다.
    position이 문자열 "beforebegin"과 ASCII 대소문자 구분 없는 일치인 경우
    컨텍스트 객체부모 안에서 컨텍스트 객체 앞에 fragment삽입한다.
    position이 문자열 "afterbegin"과 ASCII 대소문자 구분 없는 일치인 경우
    컨텍스트 객체 안의 그 첫 번째 자식 앞에 fragment삽입한다.
    position이 문자열 "beforeend"와 ASCII 대소문자 구분 없는 일치인 경우
    fragment컨텍스트 객체추가한다.
    position이 문자열 "afterend"와 ASCII 대소문자 구분 없는 일치인 경우
    컨텍스트 객체부모 안에서 컨텍스트 객체다음 형제 앞에 fragment삽입한다.
매개변수 타입 Null 가능 선택 사항 설명
position DOMString
text DOMString
반환 타입: void

8. Range 인터페이스에 대한 확장

partial interface Range {
    [CEReactions, NewObject]
    DocumentFragment createContextualFragment (DOMString fragment);
};

8.1 메서드

createContextualFragment
docFragment = range . createContextualFragment(markupString)
주어진 마크업 문자열에서 생성된 DocumentFragment를 반환한다.

createContextualFragment(fragment) 메서드는 다음 단계를 실행해야 한다.

  1. node컨텍스트 객체시작 노드로 둔다.

    elementnode의 인터페이스에 따라 다음과 같이 둔다.

    Document
    DocumentFragment
    null
    Element
    node
    Text
    Comment
    node부모 요소
    DocumentType
    ProcessingInstruction
    [DOM4]가 이 경우를 방지한다.
  2. element가 null이거나 다음이 모두 참이면:

    element를 다음을 가진 새 요소로 둔다.

  3. fragmentmarkup으로, elementcontext element로 하여 조각 구문 분석 알고리즘을 호출한 결과를 fragment node로 둔다.
  4. fragment node 안의 모든 스크립트에서 "already started" 표시를 제거한다.
  5. fragment node의 값을 반환한다.
매개변수 타입 Null 가능 선택 사항 설명
fragment DOMString
반환 타입: DocumentFragment

A. 개정 이력

다음은 이 명세의 마지막 공개 이후 변경 사항에 대한 정보성 요약이다. 이 명세의 편집자 초안의 전체 개정 이력은 여기에서 확인할 수 있다.

B. 감사의 말

이 명세의 초기 초안을 유지하고 살아있는 명세에서 지속적으로 개선해 준 Ms2ger [Mozilla]에게 감사한다.

Victor Costan, Aryeh Gregor, Anne van Kesteren, Arkadiusz Michalski, Simon Pieters, Henri Sivonen, Josh Soref 및 Boris Zbarsky에게, 유용한 의견에 대해 감사한다.

[HTML5]에서 innerHTMLouterHTML 속성과 insertAdjacentHTML() 메서드를 정의하고 유용한 의견을 준 Ian Hickson에게 특별히 감사한다.

C. 참고 문헌

C.1 규범적 참고 문헌

[HTML5]
Ian Hickson; Robin Berjon; Steve Faulkner; Travis Leithead; Erika Doyle Navara; Edward O'Connor; Silvia Pfeiffer. W3C. HTML5. 2014년 10월 28일. W3C 권고안. URL: http://www.w3.org/TR/html5/
[RFC2119]
S. Bradner. IETF. RFC에서 요구 수준을 나타내는 데 사용하는 핵심 단어. 1997년 3월. Best Current Practice. URL: https://tools.ietf.org/html/rfc2119
[WEBIDL]
Cameron McCormack; Boris Zbarsky. W3C. WebIDL Level 1. 2016년 3월 8일. W3C 후보 권고안. URL: http://www.w3.org/TR/WebIDL-1/

C.2 정보성 참고 문헌

[DOM4]
Anne van Kesteren; Aryeh Gregor; Ms2ger; Alex Russell; Robin Berjon. W3C. W3C DOM4. 2015년 11월 19일. W3C 권고안. URL: http://www.w3.org/TR/dom/
[XML10]
Tim Bray; Jean Paoli; Michael Sperberg-McQueen; Eve Maler; François Yergeau et al. W3C. Extensible Markup Language (XML) 1.0 (Fifth Edition). 2008년 11월 26일. W3C 권고안. URL: http://www.w3.org/TR/xml