7

My code gets JSON from an Ajax call, which contains XML, and goes through it reading some information.

Although the parsing of the XML runs fine in Chrome, it does not in IE, since in IE outerHTML returns undefined.

I have gone through several posts and tried several possible solutions with no success.

The JavaScript code is:

$.ajax({
    url: 'getJSONwithXML.do',
    type:'POST',
    data:'',
    dataType: 'json',
    cache: false
}).done(function(data) {
    var jsonResp = JSON.parse(data.data.respuesta);
    var parser = new DOMParser();
    var xmlDoc = parser.parseFromString(jsonResp,"text/xml");
    var texto = $(xmlDoc).find('texto').prop('outerHTML');
    console.log(texto); // <--- undefined in IE
    $('body').append('<div>' + texto + '</div>');
});

The xml I get under jsonResp is:

<?xml version="1.0" encoding="UTF-16"?>
<envio>
    <version>1.0.0</version>
    <anuncios>
        <remitente>
            <nodoRemitente>Nodo Remitente</nodoRemitente>
        </remitente>
        <anuncio>
            <emisor>
                <nodoEmisor>Nodo Emisor</nodoEmisor>
            </emisor>
            <metadatos>
                <id>16249</id>
            </metadatos>
            <contenido>
                <texto>
                    <p>
                        Notificación de prueba
                    </p>
                    <p>
                        Notificación de prueba
                    </p>
                    <p>
                        Notificación de prueba
                    </p>
                </texto>
            </contenido>
        </anuncio>
    </anuncios>
</envio>

Under Chrome or Fireforx, texto returns

<texto>
    <p>
        Notificación de prueba
    </p>
    <p>
        Notificación de prueba
    </p>
    <p>
        Notificación de prueba
    </p>
</texto>

which is what I want (the HTML code within texto tag), but in Internet Explorer I get undefined.

I have seen the textContent property but this is not what I want because it is not the HTML code.

Any ideas?

4

3 回答 3

17

Internet Explorer 不为 XML 文档中的节点提供outerHTML属性 (nor innerHTML)。您可以使用XMLSerializer(在 IE 9+ 中)来解决这个问题:

var node = $(xml).find('texto')[0]; // get DOM node
// Try outerHTML. If not available, use XMLSerializer
var texto = node.outerHTML || new XMLSerializer().serializeToString(node);

您会注意到该texto字符串可能会获取xmlns根节点的属性。但我认为这对你使用它的方式并不重要。

于 2017-07-31T08:15:32.643 回答
0

因为您使用的是 JQuery(与返回单个 DOM 元素的标准 DOM API 方法相反),所以您的所有 JQuery 查询将至少返回一个 JQuery 包装集。该包装集可能已填充或未填充,因此您不应该测试包装集的存在,而应该测试它的内容。这是通过检查length集合来完成的。

此外,您的测试以确保您想要获取的元素outerHTML有点复杂。当您测试 时,您将得到"undefined"(作为字符串)typeof,因此请确保在测试时使用它undefined作为字符串。

看这个例子:

// There is no element with an id of "special" in this DOM
var result = $("#special");

// But, the JQuery query will still return a "wrapped set" container object
console.log(result === null);                         // false - there is a wrapped set

// You need to test for what's in the container:
console.log(result.length > 0);                       // false - the set is empty
console.log(typeof result[0] === "undefined");        // true  - nothing exists at position 0
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

所以你的代码应该检查length. 请记住,在条件length0使用的aif是“假的”并将转换为false,而任何其他值都是“真实的”并将转换为true

if($(this).find('texto').length){
  debugger;
  var texto = $(this).find('texto').prop('outerHTML');
  .  . .
}

但是由于您可能需要多次访问该包装集,您可以使用:

var el = $(this).find('texto');

if(el.length){
  debugger;
  var texto = el.prop('outerHTML');
  .  . .
}
于 2017-07-28T14:33:07.317 回答
0

我认为问题在于您正在使用 jQuery 的 HTML 方法与DOMParser跨 XML 的底层方法的混合。$(this).find(...)在各种版本的 IE 中做了很多工作来解决其易碎的文档模型,但是其中很多都不能很好地与 XML 配合使用。

IE 支持 XML,但它在自定义元素方面存在问题,因此<texto>在 XML 中很好,但在 HTML5 中无法识别。

为了确定我们需要了解 jQuery 的确切版本和 IE 当前使用的文档模型(基于文档声明)。

但是,解决此问题的一种简单方法是将 jQuery 切换为 XML 解析步骤,或者从本机切换DOMParser$.parseXML

我会先尝试前者 - 将所有的替换$(this).find(...)this.getElementsByTagName(...).

于 2017-07-28T14:34:58.730 回答