简体   繁体   English

分组XML元素并使用javascript显示

[英]grouping XML elements and displaying using javascript

I have an XML whose elements i need to group and display using javascript. 我有一个XML,我需要使用javascript对其进行分组和显示。 How can I parse the xml so that the final output would be the count of the distinct elements. 如何解析xml,以便最终输出将是不同元素的计数。 ie

The XMlstring XMlstring

 txt = txt + "<FileList>";
            txt = txt + "<File>";
            txt = txt + "<FileID>1234</FileID>";
            txt = txt + "<FileType>image</FileType>";
            txt = txt + "<FileDateTime>201112345</FileDateTime>";
            txt = txt + "<FileTitle>something1</FileTitle>";
            txt = txt + "<FileSize>123</FileSize>";
            txt = txt + "</File>";
            txt = txt + "<File>";
            txt = txt + "<FileID>1209</FileID>";
            txt = txt + "<FileType>image</FileType>";
            txt = txt + "<FileDateTime>201167890</FileDateTime>";
            txt = txt + "<FileTitle>something1</FileTitle>";
            txt = txt + "<FileSize>123</FileSize>";
            txt = txt + "</File>";
            txt = txt + "</FileList>";

Html I want to display Html我想显示

  201112345 (1)
  201167890 (1)

Any Help would be appreciated, 任何帮助,将不胜感激,

Thanks, bhat 谢谢,巴特

You're using jQuery so you can use that to give you easy access to your XML's DOM. 您正在使用jQuery,因此您可以使用它来轻松访问XML的DOM。

Just instantiate a jQuery wrapper for your XML in the usual manner: 只需以通常的方式为XML实例化一个jQuery包装器:

var $xml = $(txt);

Then, find all the <FileDateTime> children and summarize their content in an object: 然后, 找到所有<FileDateTime>子项并在对象中汇总其内容:

var summary = { };
$xml.find('FileDateTime').each(function() {
    // Get the element's content as text.
    var dt = $.trim($(this).text());

    // And update the summary
    if(!summary.hasOwnProperty(dt))
        summary[dt] = 0;
    ++summary[dt];
});

Then you have your summary data in summary . 然后,你必须在你的汇总数据summary

Live example: http://jsfiddle.net/ambiguous/gKgyr/ 实例: http//jsfiddle.net/ambiguous/gKgyr/


UPDATE : Based on this question about XML parsing in IE , I think using $.parseXML will help with IE: 更新 :基于这个关于IE中XML解析的问题 ,我认为使用$.parseXML将有助于IE:

var $xml = $($.parseXML(txt));

I can't check right now though but here's a live version of this one: http://jsfiddle.net/ambiguous/gKgyr/12/ 我现在不能检查,但这是这个的实时版本: http//jsfiddle.net/ambiguous/gKgyr/12/

Edit: Does not work with Internet Explorer. 编辑:不适用于Internet Explorer。 Will add support for that in a bit. 稍微增加一点支持。

A simple, unoptimized implementation without jQuery; 没有jQuery的简单,未经优化的实现;

var parser = new DOMParser();
var xmlDoc = parser.parseFromString(txt, "text/xml");
var dates = xmlDoc.evaluate("/FileList/File/FileDateTime/text()", xmlDoc, null, XPathResult.ANY_TYPE, null);

var result,
  map = {},
  summary = "";

while (result = dates.iterateNext()) {
  var date = result.nodeValue.trim();
  map[date] = map[date] ? ++map[date] : 1;
}

for(var key in map)
  summary += key + "&nbsp;(" + map[key] + ")<br />";

document.getElementById("output").innerHTML = summary;

Edit: With Internet Explorer support, it became a mess. 编辑:在Internet Explorer的支持下,它变得一团糟。 I would use jQuery if possible. 如果可能的话我会使用jQuery。

// Adding trim support to Internet Explorer ...
if(typeof String.prototype.trim !== 'function') {
  String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g, ''); 
  }
}

var xpath = "/FileList/File/FileDateTime/text()",
  map = {},
  summary = "";

if (window.DOMParser) {
  var parser=new DOMParser();
  var xmlDoc = parser.parseFromString(txt,"text/xml");
  var dates = xmlDoc.evaluate("/FileList/File/FileDateTime/text()", xmlDoc, null, XPathResult.ANY_TYPE, null);

  var node;
  while (node = dates.iterateNext()) {
    var date = node.nodeValue.trim();
    map[date] = map[date] ? ++map[date] : 1;
  }
} else {
  // Internet Explorer
  var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  xmlDoc.async="false";
  xmlDoc.loadXML(txt); 
  var dates = xmlDoc.selectNodes(xpath);

  for (var i = 0; i < dates.length; i++) {
    var date = dates[i].nodeValue.trim();
    map[date] = map[date] ? ++map[date] : 1;
  }
}

for(var key in map)
  summary += key + "&nbsp;(" + map[key] + ")<br />";

document.getElementById("output").innerHTML = summary;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM