在Windows 8 Javascript应用程序中将XML的字符串表示形式转换为XML DOM对象

时间:2012-12-01 12:29:52

标签: javascript xml dom windows-8 windows-store-apps

我正在创建一个Windows 8 JavaScript应用程序,我需要转换一个像这样的字符串:

<p>
  blah blah blah
</p>
<div>
  <p>
    random dom stuff
  </p>
</div>

进入XML DOM对象,因此我可以使用DOM方法遍历它(即getElementByID())。

我尝试了两种方式

 //retrieve text to process
 var content = xml.querySelector("api > parse > text").textContent;

 //1
 var contentXML = new DOMParser().parseFromString(content, "text/xml");

 //2
 var newContentXML = new ActiveXObject("Microsoft.XMLDOM");
 newContentXM.async = false;
 newContentXM.loadXML(content);

两者都失败了。 Only one root element is allowed.排名第1,Automation server can't create object. Can't load the ActiveX plug-in that has the class ID '{2933BF90-7B36-11D2-B20E-00C04F983E60}'. Applications can't load ActiveX controls.排名第2

我看过的每个地方都说#2是你应该在IE中做的,我假设W8 JS应用程序使用与IE相同的JavaScript引擎。

如何将文本转换为XML DOM对象?

2 个答案:

答案 0 :(得分:2)

DOMParser很好,错误很准确。 parseFromString返回文档的实例,但是您的文本没有定义单个文档根,它是两个的串联:段落和div。

以下内容可行:

<div>
  <p>
    blah blah blah
  </p>
  <div>
    <p>
      random dom stuff
    </p>
  </div>
</div>

顺便使用原始字符串

  • Chrome的DOMParser实施也会抛出错误“文档末尾的额外内容”
  • Firefox产生“XML分析错误:文档元素之后的垃圾。”

答案 1 :(得分:0)

IE是一种痛苦,并且以更复杂的方式做事。虽然DOMParser适用于大多数浏览器,但在IE中,您需要创建一个ActiveX对象MSXML2.DOMDocument.6.0MSXML2.DOMDocument.3.0MSXML2.DOMDocument - 首先支持这些对象。以下是一些检测使用内容的代码:

var xml, tmp;
try {
    if (isIE)   // add your IE detection here
    {
        var versions = ["MSXML2.DOMDocument.6.0",
                "MSXML2.DOMDocument.3.0",
                "MSXML2.DOMDocument"];

        for (var i = 0; i < 3; i++){
            try {
                xml = new ActiveXObject(versions[i]);

                if (xml)
                    break;
            } catch (ex){
                xml = null;
            }
        }

        if (xml)
        {
            xml.async = "false";
            xml.loadXML(str);
        }
    }
    else {
        tmp = new DOMParser();
        xml = tmp.parseFromString(str, "text/xml");
    }
} catch(e) {
    xml = null;
}