Jquery 如何在ajax响应中重新排序一些XML,以获得更好的报告

Jquery 如何在ajax响应中重新排序一些XML,以获得更好的报告,jquery,ajax,xml,Jquery,Ajax,Xml,我对此有点纠结,并将我的问题重新框定为基本的必需品。我有一个通过ajax从SQL数据库检索XML提要的脚本。我真的无法构造它是如何产生的,它来自一个我无法更改的存储过程。XML中存在一些重复的节点。我需要做的是重新组合,这样我就可以在页面上以不同的数据视图输出数据 以下是数据: <tcm:ListPublishItems xmlns:tcm="http://xxxx"> <tcm:PublicationTarget xmlns:tcm="http://www.tridi

我对此有点纠结,并将我的问题重新框定为基本的必需品。我有一个通过ajax从SQL数据库检索XML提要的脚本。我真的无法构造它是如何产生的,它来自一个我无法更改的存储过程。XML中存在一些重复的节点。我需要做的是重新组合,这样我就可以在页面上以不同的数据视图输出数据

以下是数据:

    <tcm:ListPublishItems xmlns:tcm="http://xxxx">
<tcm:PublicationTarget xmlns:tcm="http://www.tridion.com/ContentManager/5.0" ID="tcm:0-2-65537" Title="ProdPreview">
    <tcm:Page ID="tcm:17-999999-64" Title="testpage" Path="\usweb\wr\aps\jtest" Icon="T64LRE0">
        </tcm:Page>
    <tcm:Page ID="tcm:17-222222-64" Title="singletest" Path="\usweb\wr\aps\jtest\single" Icon="T64LRE0">
        </tcm:Page>
</tcm:PublicationTarget>
<tcm:PublicationTarget xmlns:tcm="http://xxxx" ID="tcm:0-65-65537" Title="TestPreview">
    <tcm:Page ID="tcm:17-999999-64" Title="testpage" Path="usweb\wr\aps\jtest" Icon="T64LRE0">
        </tcm:Page>
</tcm:PublicationTarget>
在本例中,有两个PublicationTarget节点,一个有两个页面,一个有一个页面。在第二个节点中,页面与第一个节点的页面相同。我需要做的是输出内容,使其以页面为中心,而不是以发布目标为中心

即 页面tcm:17-999999-64-PubTargets-ProdPreview,TestPreview 第17-22222-64页-公共目标-生产许可证

我的代码

function parseITPData(data){
    var xmlDoc = $j.parseXML(data.d);
    var $xml = $j(xmlDoc);
    var items = $xml.find("Page");
    var newHtml = ""
    var storage = {};
    var pTCM,targetType,title,path;
    for (var i =0; i<items.length; i++) {
        pTCM = items[i].getAttribute("ID");
        targetType = items[i].parentNode.getAttribute("Title");
        path = items[i].getAttribute("Path");
        title  = items[i].getAttribute("Title");

        if ( pTCM in storage ) {
            storage[pTCM].push(targetType);     
            console.log ("nope");
        }
    else {
        storage[pTCM] = [];
        storage[pTCM].push(targetType);
        }
    }
    for (var prop in storage) {
        if (storage.hasOwnProperty(prop)){ }                
            newHtml += "<div style='margin:5px; padding:5px; border-bottom: 1px dotted #9C9C9C; font-size:95%'><div> <b>Page\/Component Published:</b> "+ title +
            " </div><div class='itpPath'>Path: "+ path +
            "</div><div class='itpTCM'>Item URI: " + "<input type='text' value=" + prop + " readonly>" + 
            "<input type='button' value='View Page' onclick='window.open(\"/WebUI/item.aspx?tcm=64#id=" + prop + "\")'> "+ 
            "</div><div class='itpPub'> Publication Target: " + storage[prop].join(', ') + 
            "</div></div>";
        }
    $j("#results").html(newHtml);
    $j("#loadingImage").hide();
}

不幸的是,只报告正确的ID和出版物分组,但只提供路径和标题循环中的最后一项。

只需将存储对象稍微深一点,使其看起来像:

{ PcTmVal_1:{ 目标类型:[ ProdPreview, 测试预览 ], 标题:testpage, 路径:somepath/url/ }, PcTmVal_2:{ 目标类型:[ ProdPreview, 测试预览 ], 标题:另一个标题, 路径:另一个路径/url/ } } 您的第一个循环看起来像:

如果存储器[pTCM]==未定义{ 存储器[pTCM]={ targetType:[], 标题:标题,, 路径:路径 } } 存储[pTCM].targetType.pushtargetType; 然后在第二个循环中替换

+标题+

+存储[prop]。标题+

而不是存储[prop].join','它将是存储[prop].targetType.join','