我目前正在使用Knockout创建一些在移动中由第三方工具使用的XML。
相当直接,
var queryString = "";
var query = [
'<Values data-bind="foreach: items, attr: {\'data-bind\': false}">',
'<Value data-bind="text: $data, attr: {\'data-bind\': false}"></Value>',
'</Values>'
];
var queryTemplate = query.join("");
var tmpDiv = document.createElement("div");
tmpDiv.innerHTML = queryTemplate;
ko.applyBindings({
field: field,
items: items
}, tmpDiv);
queryString = tmpDiv.innerHTML;
然而,令我非常沮丧的是,输出节点都是小写的:
<values>
<value>1778</value>
</values>
在一般的网络工作中,上述问题不是问题,但是第三方工具大写敏感,因此将节点格式化为最初指定的至关重要:
<Values>
<Value>1778</Value>
</Values>
我错过了Knockout手册中的内容吗?有一个简单的解决方法吗?
答案 0 :(得分:1)
正如dperry的问题评论中所指出的那样,这确实是一个HTML与XML问题。使用jQuery's parseXML()
并绑定到
结果元素有助于轻松解决问题:
var tmpDiv = $.parseXML(queryTemplate);
然后只需绑定到tmpDiv.documentElement
并使用其innerHTML
代替。
如果你不使用jQuery,你可以解决只是使用他们的上述功能的实现,可能已经过时,原始许可适用:
// Cross-browser xml parsing
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;
}