将 XML 节点映射到 HTML 表单元素

Posted

技术标签:

【中文标题】将 XML 节点映射到 HTML 表单元素【英文标题】:Mapping XML nodes into HTML form elements 【发布时间】:2015-08-21 12:34:23 【问题描述】:

我想将 XML 节点值(从 AJAX 脚本发送的 XML)映射到相应的 html 表单元素中。例如,一个 XML 数据;

<object>
  <fielda>John</fielda>
  <fieldc>Tailor</fieldc>
</object>

应该通过脚本插入到 HTML 表单中:

<form name="myform">
  <input name="fielda" value="">
  <input name="fieldc" value="">
</form>

要注意的是脚本应该对所有对象通用(无法提前知道将在 XML 中给出哪些字段,例如,如果“fieldx”以 XML 形式发送,则此脚本应满足 document.myform.fieldx 表单元素和相应的来自 XML 的值)。所以这个脚本应该遍历所有的 XML 节点并尝试将值设置为 HTML 表单。

【问题讨论】:

也许使用 XSL T 是要走的路 【参考方案1】:

jsfiddle

HTML

<form name="myform">
    <input name="fielda" value=""/>
    <input name="fieldc" value=""/>
</form>
<div id="status">Loading...</div>

CSS

#status 
    font-style:italic;
    font-size:0.8em;

javascript

$.ajax(
    'url':'/echo/xml/',
    'method':'POST',
    'data':
        xml:'<object>\n<fielda>John</fielda>\n<fieldc>Tailor</fieldc>\n</object>',
        'delay':1
    ,
    'complete':function(xhr,status) 
        console.log(xhr);
        var form = document.myform;
        var root = xhr.responseXML.children[0];
        for (var i = 0; i < root.children.length; ++i) 
            var field = root.children[i];
            form[field.nodeName].value = field.textContent;
         // end for
        document.getElementById('status').textContent = '';
    
);

【讨论】:

在 JS 中难道没有类似 foreach(nodes as node) 的东西来循环遍历所有子节点而不是 for() 循环吗? @sbrbot 有for (var propName in obj),但它会遍历obj 的所有拥有和继承的属性名称。有for each (var propValue in obj),但它会循环遍历obj 的所有拥有和继承的属性值,并且已被弃用。有for (var x of obj),但这是新的和实验性的。还有.. Array::forEach(),但这需要一个 lambda 回调函数并且很混乱。传统的for 循环是这里循环数组的最佳方法。

以上是关于将 XML 节点映射到 HTML 表单元素的主要内容,如果未能解决你的问题,请参考以下文章

FormData对象

将 HTML5 占位符属性添加到 Spring 3.0 表单输入元素

如何将焦点设置到独立于 id 的 HTML 表单中的第一个输入元素?

Knockout JS 如何将数据绑定到静态表单元素

显示时将相同的 HTML 表单元素插入到多个模式中,但验证不起作用

如何使用 JavaScript 将焦点设置在 HTML 表单中的元素上?