2010-01-07 2 views
1

루트 <svg> 요소 앞에 xml 프롤로그 뒤에 주석 노드를 추가하는 방법은 무엇입니까?루트 <svg> 요소 앞에 주석을 삽입하는 방법은 무엇입니까?

또는 직렬화 된 DOM에 regexp와 함께 주석을 삽입하는 것이 리소스 비용이 적게 듭니까?

+1

어떤 환경입니까? 이것은 서버 측으로 보입니다. 그렇다면 통역사 등 – slebetman

+0

브라우저 내부. 디스크에서 문자열로 파일을 읽어서 DOMParser를 통해 DOM으로 만듭니다. 가능한 한 코드의 앞부분에 주석을 추가해야하지만 xml 프롤로그 앞에 유효하지 않은 xml이 있으므로 주석을 추가해야합니다. –

답변

2

루트 요소 (즉, xml 프롤로그 및 DTD 제외)는 documentElement입니다. 당신은 그것으로 insertBefore를 사용할 수 있습니다

var s = '<?xml version="1.0" encoding="ISO-8859-1"?>\n' + 
     '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"\n' + 
     ' "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n' + 
     '<svg width="100%" height="100%" version="1.1" ' + 
     '  xmlns="http://www.w3.org/2000/svg">\n' + 
     ' <circle cx="100" cy="50" r="40" stroke="black" ' + 
     '   stroke-width="2" fill="red"/>\n' + 
     '</svg>', 
    doc = new DOMParser().parseFromString(s, 'text/xml'); 

// insert a comment node before the root node 
doc.insertBefore(doc.createComment('foo'), doc.documentElement); 

new XMLSerializer().serializeToString(doc) 출력 확인하려면 : 일부 브라우저 (내가 믿는 웹킷)이 직렬화 된 출력에서 ​​프롤로그를 ommit 것

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 
<!--foo--> 
<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg"> 
    <circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red"/> 
</svg> 

주 (어쨌든 선택 사항입니다). 그러나 주석 노드는 여전히 DTD 다음에 존재합니다.

덜 비싸다는 것이 확실하지 않습니다. 이 한 가지 이외의 다른 DOM 폼 문자열이 필요하지 않으면 DOM 파서를 통과 할 가치가 없을 수도 있습니다 (특히 어쨌든 문자열로 다시 직렬화하는 것).

+0

고마워요! 그게 내가 필요한거야! SVG 뷰어 오페라 위젯 (http://my.opera.com/SpShut/blog/2010/01/05/opera-svg-viewer-widget-v0-3b)을 만들고 Opera에서 xml 프롤로그를 삽입합니다. 너비/높이/viewBox 특성을 가져 오려면 DOM이 필요하므로 재치있는 DOM을 사용하는 것이 가장 좋습니다. 많은 감사합니다! –

0

아래처럼?

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!-- sample comment in SVG file 
    can be multi-line 
--> 
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 
    <circle cx="100" cy="110" r="40" style="fill: #FF0"/> 
    <circle cx="100" cy="210" r="30" style="fill: none; stroke: #F00; stroke-width: 2px"/> 
</svg> 
+1

예, 이것처럼,하지만 DOM에 자바 스크립트를 삽입하는 것을 의미합니다. ''에 대한 부모 요소가 없으므로 insertBefore()가 작동하지 않습니다. –

관련 문제