1

次のコード

var ns1 = 'hello:world1',
    doc = document.implementation.createDocument('nsdoc', 'doc', null),
    outer = doc.createElement('outer'),
    s = new XMLSerializer(),
    elm;

outer.setAttribute('xmlns:ns1', ns1);
elm = doc.createElementNS(ns1, 'Inner');

outer.appendChild(elm);

console.log(s.serializeToString(outer));

chrome と firefox で次の xml ドキュメントを出力します。

<outer xmlns:ns1="hello:world1">
  <Inner xmlns="hello:world1"/>
</outer>

これは技術的にはまだ有効ですが、重複したns宣言を削除する方法はありますか? たとえば、ドキュメントは次のように表示されることが望ましいでしょう。

<outer xmlns:ns1="hello:world1">
  <ns1:Inner/>
</outer>
4

1 に答える 1

0

DOMParser と少し不快な手書きの XML を使用して、名前空間をシリアル化する方法をより適切に制御する方法を見つけました (ただし、ルート ノードのみ)。次のJavaScriptはこれを行いました:

var parser = new DOMParser(),
    s = new XMLSerializer(),
    dom1 = parser.parseFromString('<doc xmlns="one"></doc>', 'text/xml'),
    dom2 = parser.parseFromString('<outer xmlns="one" xmlns:ns3="hello-world"></outer>', 'text/xml'),
    myElm = dom2.createElementNS('hello-world', 'ns3:Inner');

dom2.documentElement.appendChild(myElm);
dom2.documentElement.attributes.removeNamedItem('xmlns');
dom1.documentElement.appendChild(dom2.documentElement);
console.log(s.serializeToString(dom1));

これにより、Chrome (Mac では 26.0)、Firefox (Mac では 21.0)、および Opera (Mac では 12.15) で次の xml が出力されますが、Opera には xml 宣言も含まれていますが、これは私のニーズには問題ありません)。

<doc xmlns="one">
  <outer xmlns:ns3="hello-world">
    <ns3:Inner/>
  </outer>
</doc>
于 2013-05-24T00:17:16.337 に答える