Knockout保持XML节点大小写

时间:2015-05-05 16:42:10

标签: javascript xml knockout.js

我目前正在使用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手册中的内容吗?有一个简单的解决方法吗?

1 个答案:

答案 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;
}