javascript - 具有主从关系的数据表ajax xml显示

标签 javascript jquery xml datatables

通过 jQ bootstrap 4 数据表网格 (datatable.net),我想以表格形式显示以下 xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
 <persns> 
  <prsn> 
  <fname>Smith</fname>  <!-- first name-->
  <lname>Milton</lname> <!-- last name --> 
  <age>44</age> 
  <e-mail>smilt@gmail.com</e-mail> 
  <phnmbr>3568236712</phnmbr>
  <addrss>5th summer st, mntb</addrss>
  <city>Portland</city>
 </prsn>
 <prsn> 
  <fname>Ken</fname> 
  <lname>Jackson</lname> 
  <age>37</age>
  <e-mail>ken.jackson@yahoo.com</e-mail> 
  <phnmbr>2638762076</phnmbr> 
  <addrss>19th Penfield ave, brtcl</addrss>
  <city>Kelowna</city>
 </prsn>
 <prsn> 
  <fname>Susan</fname>
  <lname>Arkland</lname> 
  <age>48</age>
  <e-mail>s.arklnd@hotmail.com</e-mail>
  <phnmbr>50834219704</phnmbr>
  <addrss>34th Mansfield st, sgtp</addrss>
  <city>Raleigh</city>
 </prsn>
 <prsn>
  <fname>Patsy</fname> 
  <lname>Brighton</lname>
  <age>38</age>
  <e-mail>patsy.brghton@gmail.com</e-mail> 
  <phnmbr>814522096358</phnmbr> 
  <addrss>12th Peel st, pnslv</addrss>
  <city>Philadelphia</city>
 </prsn>
 <prsn>
  <fname>John</fname>
  <lname>Torg</lname>
  <age>54</age>
  <e-mail>john.torg@tzeus.com</e-mail> 
  <phnmbr>042197327784</phnmbr>
  <addrss>27th north st, cnda</addrss>
  <city>Penticton</city>
</prsn>

但具有主从功能,如以下 fiddle 链接所示:

https://jsfiddle.net/nnb97rh9/3/

只有到那个 fiddle 为止有 .json 数据! (我需要 .xml 显示) 相应的(几乎功能性的).js(通过主表我只想显示以下表头: fname、lname、age、city 其余的将被隐藏;它们只会显示为相关的子表行)如下:

$(function(){
 var prstbl = $("#prsns").dataTable(columns: [{"class":'details-control', 
"orderable":false, "data":null, "defaultContent":''},
          {dtaTbl:"fname"},
          {dtaTbl:"lname"},
          {dtaTbl:"age"},
          {dtaTbl:"city"},
          {dtaTbl:"e-mail", "visible":false},
          {dtaTbl:"phnmbr", "visible":false},
          {dtaTbl:"addrss", "visible":false}
         ]}),
 oTable = $('#prsne').DataTable()

function format(d)
{ 
  return '<table cellpadding="3" cellspacing="0" border="0" style="padding- 
  left:40px">'
+ '<tr>' + '<td>e-mail addrss</td>'
+ '<td>' + d.email + '</td>' + '</tr>'
+ '<tr>' + '<td>phn nmber</td>'
+ '<td>' + d.phnmbr + '</td>' + '</tr>'
+ '<tr>' + '<td>address</td>'
+ '<td>' + d.addrss + '</td>' + '</tr>'
+ '</table>'
}

$.ajax({type:"GET", url:"persns.xml", dataType:"xml", success:
function(xml)
{
var prsns = $(xml).find("prsn")
prsns.each(function(idx, prs)
        {
         var prs = $(prs), dtaTbl = [] 
         prs.children().each(function(j,chdnd)
             {
              dtaTbl.push($(chdnd).text())  
             })
         prstbl.fnAddData(dtaTbl)
      })
 }
})

$('#prsns tbody').on('click', 'td.details-control', function()
        {
         var tr = $(this).closest('tr'),
             row = oTable.row(tr) 
         if(row.child.isShown()) // if the row is already expanded, 
    collapse it
         {
          row.child.hide()
          tr.removeClass('shown')
         }
         else // if collapsed row, expandit it 
         {
          row.child(format(row.data())).show()
          tr.addClass('shown')
      }
   })
 })

相关的.html部分是这样的:

<body>
 <h5>Master-detail persons display</h5>
  <table id="prsns" border="1" class="table display" width="60%">
  <thead><tr><th></th><th>frst nme</th><th>name</th><th>age</th> 
   <th>city</th> <th>e-mail addrss</th></tr></thead> 
  <tbody></tbody>
 </table>
</body>

还有一个像这样的小 .css 文件:

td.details-control { background:url(' https://raw.githubusercontent.com/DataTables/DataTables/1.10.7/examples/resources/details_open.png ') 不重复中心 center; 光标:指针; }

tr.shown td.details-control { background:url(' https://raw.githubusercontent.com/DataTables/DataTables/1.10.7/examples/resources/details_close.png ') 不重复中心 center; }

我再说一遍,我需要针对这个 .xml 文件完成所有显示,而不是 .json 或仅 .html ! 我知道如何使用 .json 表来做到这一点。 所以请大家帮我解决这个问题。 先谢谢大家了

最佳答案

代码存在多个问题,无法描述。下面是更正后的代码。

请注意,我使用 jsFiddle 机制来检索 XML 文件,请替换为您自己的。

(function () {
   function format(d) {
      return '<table cellpadding="3" cellspacing="0" border="0" style="padding-left: 40 px ">' +
         '<tr>' + '<td>e-mail addrss</td>' +
         '<td>' + d['e-mail'] + '</td>' + '</tr>' +
         '<tr>' + '<td>phn nmber</td>' +
         '<td>' + d['phnmbr'] + '</td>' + '</tr>' +
         '<tr>' + '<td>address</td>' +
         '<td>' + d['addrss'] + '</td>' + '</tr>' +
         '</table>';
   }

   var prstbl = $("#prsns").DataTable({
      columns: [
         {
            "class": 'details-control',
            "orderable": false,
            "data": null,
            "defaultContent": ''
         },
         {
            data: "fname"
         },
         {
            data: "lname"
         },
         {
            data: "age"
         },
         {
            data: "city"
         },
         {
            data: "e-mail",
            "visible": false
         },
         {
            data: "phnmbr",
            "visible": false
         },
         {
            data: "addrss",
            "visible": false
         }
      ]
   });

   $.ajax({
      type: "POST",
      url: "/echo/xml",
      data: {
            xml: '<?xml version="1.0" encoding="UTF-8" ?><persns>'
            + '<prsn><fname>Smith</fname><lname>Milton</lname><age>44</age><e-mail>smilt@gmail.com</e-mail><phnmbr>3568236712</phnmbr><addrss>5th summer st, mntb</addrss><city>Portland</city></prsn>'
            + '<prsn><fname>Ken</fname><lname>Jackson</lname><age>37</age><e-mail>ken.jackson@yahoo.com</e-mail><phnmbr>2638762076</phnmbr><addrss>19th Penfield ave, brtcl</addrss><city>Kelowna</city></prsn>'
            + '<prsn><fname>Susan</fname><lname>Arkland</lname><age>48</age><e-mail>s.arklnd@hotmail.com</e-mail><phnmbr>50834219704</phnmbr><addrss>34th Mansfield st, sgtp</addrss><city>Raleigh</city></prsn>'
            + '<prsn><fname>Patsy</fname><lname>Brighton</lname><age>38</age><e-mail>patsy.brghton@gmail.com</e-mail><phnmbr>814522096358</phnmbr><addrss>12th Peel st, pnslv</addrss><city>Philadelphia</city></prsn>'
            + '<prsn><fname>John</fname><lname>Torg</lname><age>54</age><e-mail>john.torg@tzeus.com</e-mail><phnmbr>042197327784</phnmbr><addrss>27th north st, cnda</addrss><city>Penticton</city></prsn>'
        + '</persns>',
      },
      dataType: 'xml',
      success: function (xml) {
         var prsns = $(xml).find("prsn");
         prsns.each(function (idx, prs) {
            var rowData = [];
            $(prs).children().each(function (j, chdnd) {
               rowData[$(chdnd).get(0).tagName] = $(chdnd).text();
            });
                prstbl.row.add(rowData);
        });

        prstbl.draw();       
      }
   });

    $('#prsns tbody').on('click', 'td.details-control', function () {
      var tr = $(this).closest('tr');
      var row = prstbl.row(tr);

      // if the row is already expanded, collapse it
      if (row.child.isShown())  {
            row.child.hide();
            tr.removeClass('shown');
        // if collapsed row, expand it             
      } else {
         row.child(format(row.data())).show();
         tr.addClass('shown');
      }
   });
})();

参见updated example用于代码和演示。

关于javascript - 具有主从关系的数据表ajax xml显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60989081/

相关文章:

javascript - 如何从 Chrome 创建桌面通知?

javascript - JavaScript 中的函数重写

javascript - 如何像谷歌一样覆盖文档中的退格键功能

javascript - Wordpress 3 级水平导航 - 需要 jquery/javascript 帮助对齐

mysql - 每个客户的 XQuery 最近订单

javascript - SAPUI5:无法导航到定义的页面并出现错误(无法找到具有 ID 布局的控件 - EventProvider sap.m.routing.Target)

javascript - Konva.js 的上下文菜单

javascript - 如何为我的应用程序设置改造?

Jquery 下拉菜单在悬停时移动

java - 在 Lollipop 之前的设备(kit-kat)上使状态栏半透明,同时与果冻 bean 兼容