jQuery的XML解析中的错误消息

时间:2014-10-18 13:28:02

标签: jquery xml error-handling

我想知道jQuery在解析XML时提供了什么样的信息。 Here is an example

整体上存在错误:

  

错误:无效的XML:这根本不是有效的XML。

或者您可以使用e.message

提取邮件
  

无效的XML:根本不是有效的XML。

但还有其他方法吗?例如,它是否可能只获得" Invald XML"位?我已经谷歌搜索了很多年,但无法找到任何相关文档。

此外,jQuery是否会生成这些错误回退,或者jQuery是否只是利用了浏览器的XML处理?

2 个答案:

答案 0 :(得分:0)

您的问题的答案包含在jQuery源代码中:

jQuery.parseXML = function( data ) {
    var xml, tmp;
    if ( !data || typeof data !== "string" ) {
        return null;
    }
    try {
        if ( window.DOMParser ) { // Standard
            tmp = new DOMParser();
            xml = tmp.parseFromString( data, "text/xml" );
        } else { // IE
            xml = new ActiveXObject( "Microsoft.XMLDOM" );
            xml.async = "false";
            xml.loadXML( data );
        }
    } catch( e ) {
        xml = undefined;
    }
    if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
        jQuery.error( "Invalid XML: " + data );
    }
    return xml;
};

是的,它正在使用浏览器方法和

不,您无法在不重写方法的情况下隔离特定问题。

<强> Helpful jQuery Source Viewer with method search

答案 1 :(得分:0)

尝试

    (function($) {
    jQuery._parseXML = function ( data ) {
        var xml, tmp, e, msg;
        if ( !data || typeof data !== "string" ) {
            return null;
        }
        try {
            if ( window.DOMParser ) { // Standard
                tmp = new DOMParser();
                xml = tmp.parseFromString( data, "text/xml" );
            } else { // IE
                xml = new ActiveXObject( "Microsoft.XMLDOM" );
                xml.async = "false";
                xml.loadXML( data );
            }
        } finally {
            e = $(xml).children().contents().filter(function(i, el) {
                  return $(el).is("parsererror")
                });
                // if `parsererror` element `length` > 0
                // return `msg` , else return `undefined`
                msg = !!e.length 
                      // define error `msg` here
                      ? [ e.text()
                         , e.next()[0].previousSibling.nodeValue
                         , e.next()[0].outerHTML
                         , e.next()[0] 
                        ] 
                      : undefined;
        }
        // if `msg` !== undefined , return `msg` , else return `xml`
        return msg !== undefined ? msg : xml
    }
    }(jQuery));

(function($) {
        jQuery._parseXML = function ( data ) {
            var xml, tmp, e, msg;
            if ( !data || typeof data !== "string" ) {
                return null;
            }
            try {
                if ( window.DOMParser ) { // Standard
                    tmp = new DOMParser();
                    xml = tmp.parseFromString( data, "text/xml" );
                } else { // IE
                    xml = new ActiveXObject( "Microsoft.XMLDOM" );
                    xml.async = "false";
                    xml.loadXML( data );
                }
            } finally {                
                e = $(xml).children().contents().filter(function(i, el) {
                      return $(el).is("parsererror")
                    });
                msg = !!e.length 
                      // define error `msg` here
                      ? [ e.text()
                         , e.next()[0].previousSibling.nodeValue
                         , e.next()[0].outerHTML
                         , e.next()[0] 
                        ] 
                      : undefined;
            }
            // if ( !xml || !xml.documentElement 
            //      || xml.getElementsByTagName( "parsererror" ).length ) {
            // jQuery.error( "Invalid XML: " + data );
            // }
            return msg !== undefined ? msg : xml
        }
        }(jQuery));

console.log(
  $._parseXML("<node>abc123</node>")
  , $._parseXML("<node>abc123<node>")
)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>