0

我正在创建一个 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);

两者都失败了。#1 与Only one root element is allowed., 和 #2 与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 是你应该如何在 IE 中做到这一点,我假设 W8 JS 应用程序使用与 IE 相同的 JavaScript 引擎。

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

4

2 回答 2

2

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

以下将起作用:

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

顺便说一下你原来的字符串,

  • Chrome 的 DOMParser 实现也会抛出错误“Extra content at the end of the document”
  • Firefox 产生“XML Parsing Error: junk after document element”。
于 2012-12-01T22:17:29.680 回答
0

IE 很痛苦,而且做事的方式要复杂得多。虽然DOMParser适用于大多数浏览器,但在 IE 中,您需要创建一个 ActiveX 对象MSXML2.DOMDocument.6.0MSXML2.DOMDocument.3.0或者MSXML2.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;
}
于 2012-12-01T15:07:30.767 回答