-1

我有一个包含数据的 XML 文件,并希望将具有相同日期的项目放入其中,例如 DIV 标记。

我想要的是按日期对版本进行分类,并捆绑所有具有相同日期值的项目/版本。

这可能吗?

XML 代码:

<edition>
    <id>116853</id>
    <name>First Round - Summervibes Edition</name>
    <date>08-06-2012</date>
    <time>19:30</time>
    <location>
        Prins Alexanderlaan 37, Rotterdam, The Netherlands
    </location>
    <venue url="http://www.betribes.com/venues/club-eclipse" id="24079">Club Eclipse</venue>
    <lineup>Kleine Viezerik, Kid Kaio, DJ Goine</lineup>
    <entrance_fee>€11,–&lt;/entrance_fee>
    <music>Club House, House, R&B</music>
    <hot_party>false</hot_party>
    <website_link>http://club-eclipse.nl</website_link>
    <clubjudge_link depricated="true">
        http://www.betribes.com/editions/first-round-summervibes-edition
    </clubjudge_link>
    <edition_link>
        http://www.betribes.com/editions/first-round-summervibes-edition
    </edition_link>
    <image_flyer_front>
        http://s3-eu-west-1.amazonaws.com/btrb-prd-flyers/ye29ys93be98.jpg
    </image_flyer_front>
    <image_120x120>
        http://s3-eu-west-1.amazonaws.com/btrb-prd-flyers/ye29ys93be98-a_thumbnail-120x120.jpg
    </image_120x120>
    <excerpt/>
    <tickets>
        <ticket>
            <price>11.0</price>
            <name>Ticketscript</name>
            <url>
                https://shop.ticketscript.com/channel/web2/start-order/rid/DFEG5RE7/language/nl
            </url>
        </ticket>
    </tickets>
</edition>
4

1 回答 1

0

请参阅我上面的评论。如果我已经解释了您要正确执行的操作,我认为这是解析您的 XML 的问题。这个答案将帮助您如何做到这一点:XML parsing of a variable string in JavaScript

解析后,您需要创建一个函数,该函数可以遍历一组 edition 元素,查找那些 date 属性是您指定的元素,然后将您想要的属性值发送到例如表格的单元格中排。

建议重写你的问题

我编辑了你的问题,但我必须等待同行的反馈才能看到它。我会这样写:

我有一个 XML 文档,其中包含一个名为 edition 的元素的多个副本。我想将文档解析为 JavaScript 可以理解的格式,然后遍历所有版本元素并按日期对它们进行分组。

你会怎么做?

这是一个示例编辑元素(只有几个示例属性。真实数据更复杂):

<edition>
    <id>116853</id>
    <name>First Round - Summervibes Edition</name>
    <date>08-06-2012</date>
</edition>

链接到现有答案

编辑您的问题后,它变得更具可读性。问题是您可能仍然会被否决,因为已经有一个非常好的问题,我认为这与您的问题完全相同,并且在XML 解析 JavaScript 中的变量字符串时有很多出色的答案。

无论如何,这里有一些代码根据我上面链接到的问题中的建议给出了一般形式,更进一步地展示了您如何循环浏览版本集合。

在正文中,放置一个 div 元素来显示您的数据:

<div id="display"></div>

然后在下面放置一个带有如下代码的脚本元素:

var xmlData = "<editions><edition><id>111</id><name>First</name><date>08-06-2012</date></edition>" +
    "<edition><id>222</id><name>Second</name><date>06-04-2012</date></edition>" +
    "<edition><id>333</id><name>Third</name><date>08-06-2012</date></edition>" +
    "<edition><id>333</id><name>Fourth</name><date>06-04-2012</date></edition></editions>",
    parseXml, xml, editions, display, i, edition, nameElement, name;
if (typeof window.DOMParser != "undefined") {
    parseXml = function(xmlStr) {
        return ( new window.DOMParser() ).parseFromString(xmlStr, "text/xml");
    };
} else if (typeof window.ActiveXObject != "undefined" &&
    new window.ActiveXObject("Microsoft.XMLDOM")) {
    parseXml = function(xmlStr) {
        var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = "false";
        xmlDoc.loadXML(xmlStr);
        return xmlDoc;
    };
} else {
    throw new Error("No XML parser found");
}
xml = parseXml(xmlData);
editions = xml.getElementsByTagName("edition");

display = document.getElementById("display");
for(var i = 0; i < editions.length; i++){
    edition = editions.item(i);
    nameElement = edition.getElementsByTagName("name");
    name = nameElement[0].childNodes[0];
    div = document.createElement("div");
    div.innerHTML = name.nodeValue;
    display.appendChild(div);
}

2. 下一步

我希望你可以从那里去实现你想要的分组。您将不得不遍历所有版本并构建一个关联的组数组,可能使用日期作为键。当您发布新版本时,您会

  1. 检索日期
  2. 尝试查找具有该日期的组并将版本添加到该组的版本数组中。
  3. 如果该组不存在,则以日期为键创建一个新组,并将版本添加到该组中的版本数组中。
  4. 最后通过组对象并在一个新的 div 中显示每个组,并在其中显示版本,比如一个 ul 元素

可能有一些聪明的方法可以优化这个过程,以便您可以随时显示项目,但我在 YUI 库博客上看到绘制元素非常耗时,因此最好构建一个包含所有这些的大 HTML 字符串divulli元素,然后在最后绘制。与将新元素绘制到 DOM 中相比,JavaScript 处理往往非常快。

3. 最后一点建议

  1. 我认为只提供相关代码很重要。你的例子很长,充满了不相关的细节。
  2. 就我个人而言,我发现解析 XML 并试图浏览生成的 XML 文档很痛苦。如果您有选择,请查看JSON。对于大多数用途,JSON 可能比 XML 更好。它是 JavaScript 的一个子集,因此它已经是 JavaScript 可以理解的格式(尽管通常仍然需要解析器)。
于 2012-06-09T15:47:27.147 回答