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

时间:2014-10-20 18:24:15

标签: jquery ajax xml

我对此有点挣扎,并将我的问题重新构思到了必需品上。我有一个脚本,通过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>

在此示例中,有2个PublicationTarget节点,一个有2个页面,1个有一个页面。在第二个节点中,页面与第一个节点是同一页面。我需要做的是输出内容,使其以页面为中心而不是PublicationTarget centreit

即 Page tcm:17-999999-64 - PubTargets - ProdPreview,TestPreview Page tcm:17-222222-64 - PubTargets - ProdPreivew

我的代码

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和发布分组,但只给出路径和标题的循环中的最后一项。

1 个答案:

答案 0 :(得分:0)

只需让您的存储对象更深一点,它就像是:

{
  "PcTmVal_1": {
    "targetType": [
      "ProdPreview",
      "TestPreview"
    ],
    "title": "testpage",
    "path": "somepath/url/"
  },
  "PcTmVal_2": {
    "targetType": [
      "ProdPreview",
      "TestPreview"
    ],
    "title": "anotherTitle",
    "path": "anotherpath/url/"
  }

}

你的第一个循环看起来像:

if (storage[pTCM] === undefined) {
    storage[pTCM] = {
        targetType: [],
        title: title,
        path: path
    }
}

storage[pTCM].targetType.push(targetType); 

然后在第二个循环中替换

+ title +

+ storage[prop].title +

而不是storage[prop].join(', '),它将是storage[prop].targetType.join(', ')