【问题标题】:Error messages in jQuery's XML parsingjQuery 的 XML 解析中的错误消息
【发布时间】:2014-10-18 13:28:01
【问题描述】:
我想知道 jQuery 在解析 XML 时提供了什么样的信息。 Here is an example.
整体有错误:
错误:无效的 XML:这根本不是有效的 XML。
或者您可以使用e.message提取消息:
无效的 XML:这根本不是有效的 XML。
但是还有哪些其他方法呢?例如,是否有可能只获得“无效 XML”位?我已经用谷歌搜索了很长时间,但找不到任何关于此的文档。
另外,jQuery 会生成这些错误回退,还是 jQuery 只是利用浏览器的 XML 处理?
【问题讨论】:
标签:
jquery
xml
error-handling
【解决方案1】:
您的问题的答案包含在 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
【解决方案2】:
试试
(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>