2012-11-09 37 views
1

我想解析從我們的系統生成的XML文件,其中有多個子元素生成,但是「一起」,因爲他們有一個subchild元素是相同的。解析xml以基於具有相同的subchild元素值來分組多個子元素?

爲了使部分XML代碼我粘貼下面的感...

每個記錄確定了它的訂單號,然後它包含對該批貨物信息,並在年底列出適合該訂單單個項目與它的規格。

<forward_agent> 
    <record> 
     <order>562490</order> 
     <mfg._del_date>11-19-2008</mfg._del_date> 
     <forw.agent>263</forw.agent> 
     <customer>120</customer> 
     <name>BLUEBERRY AUBURN HILLS</name> 
     <item>&apos;28.1461.00</item> 
     <ordered>1.0000</ordered> 
     <warehouse>001</warehouse> 
     <desitnation_city_state>AUBURN HILLS MI</desitnation_city_state> 
     <weight>60.1201</weight> 
     <size>9.70</size> 
</record> 
<record> 
     <order>562490</order> 
     <mfg._del_date>11-19-2008</mfg._del_date> 
     <forw.agent>263</forw.agent> 
     <customer>120</customer> 
     <name>BLUEBERRY AUBURN HILLS</name> 
     <item>&apos;545</item> 
     <ordered>1.0000</ordered> 
     <warehouse>002</warehouse> 
     <desitnation_city_state>AUBURN HILLS MI</desitnation_city_state> 
     <weight>82.0120</weight> 
     <size>12.86</size> 
</record> 
<record> 
     <order>&#160;</order> 
     <mfg._del_date>&#160;</mfg._del_date> 
     <forw.agent>&#160;</forw.agent> 
     <customer>&#160;</customer> 
     <name>&#160;</name> 
     <item>&apos;</item> 
     <ordered>&#160;</ordered> 
     <warehouse>&#160;</warehouse> 
     <desitnation_city_state>Total Lbs:</desitnation_city_state> 
     <weight>1658.1342</weight> 
     <size>199.36</size> 
</record> 
    <record> 
     <order>562136</order> 
     <mfg._del_date>11-19-2008</mfg._del_date> 
     <forw.agent>263</forw.agent> 
     <customer>133</customer> 
     <name>BLUEBERRY ALBUQUERQUE</name> 
     <item>&apos;4635</item> 
     <ordered>2.0000</ordered> 
     <warehouse>002</warehouse> 
     <desitnation_city_state>EL PASO TX</desitnation_city_state> 
     <weight>23.9863</weight> 
     <size>4.00</size> 
</record> 
<record> 
     <order>562136</order> 
     <mfg._del_date>11-19-2008</mfg._del_date> 
     <forw.agent>263</forw.agent> 
     <customer>133</customer> 
     <name>BLUEBERRY ALBUQUERQUE</name> 
     <item>&apos;5590</item> 
     <ordered>1.0000</ordered> 
     <warehouse>002</warehouse> 
     <desitnation_city_state>EL PASO TX</desitnation_city_state> 
     <weight>0.0000</weight> 
     <size>0.00</size> 
</record> 
<record> 
     <order>562136</order> 
     <mfg._del_date>11-19-2008</mfg._del_date> 
     <forw.agent>263</forw.agent> 
     <customer>133</customer> 
     <name>BLUEBERRY ALBUQUERQUE</name> 
     <item>&apos;5591</item> 
     <ordered>1.0000</ordered> 
     <warehouse>002</warehouse> 
     <desitnation_city_state>EL PASO TX</desitnation_city_state> 
     <weight>436.0082</weight> 
     <size>96.67</size> 
</record> 
<record> 
     <order>&#160;</order> 
     <mfg._del_date>&#160;</mfg._del_date> 
     <forw.agent>&#160;</forw.agent> 
     <customer>&#160;</customer> 
     <name>&#160;</name> 
     <item>&apos;</item> 
     <ordered>&#160;</ordered> 
     <warehouse>&#160;</warehouse> 
     <desitnation_city_state>Total Lbs:</desitnation_city_state> 
     <weight>5093.0928</weight> 
     <size>613.88</size> 
</record> 

我想輸出通過訂單號進行分組,並期待與此類似:

Item   Ordered Weight   Size 
1221   1   320.6734  31.36 
1601   1   34.0724   11.42 
2122   1   86.0023   12.79 
5543.SP  1   1075.254  121.23 
28.1461.00  1   60.1201   9.7 
545    1   82.012   12.86 
      Total Lbs: 1658.1342  199.36 

最終是這樣的話,我可以根據總理清訂單重量和大小或特定物品。

---編輯---

顯示輸入框了,但他們沒有得到填充任何內容。

當前的js代碼

$(document).ready(function() 
{ 
    $.ajax({ 
    type: "GET", 
    url: "b2.xml", 
    dataType: "xml", 
    success: function(response) { parseXML(response); } 
    }); 
}); 

var recordList =[]; 

function parseXML(xml) { 
$(xml).find('record').each(function() { 
    var entry = new Object(); 
    entry.order= $(this).find('order').text(); 
    entry.delDate= $(this).find('mfg._del_date').text(); 
    entry.forw = $(this).find('forw.agent').text(); 
    entry.customer= $(this).find('customer').text(); 
    // 
    // 

    recordList.push(entry); 

}); 
send(); // handles xml after parsed 
} 

function send(){ 
    // for each row of a table 
    for(var i = 0; i < $("#table tr").size(); i++){ 
     $('#orderNum' + i).val(recordList[i].order); 
     $('#delDate' + i).val(recordList[i].delDate); 
     $('#forw' + i).val(recordList[i].forw); 
     $('#customer' + i).val(recordList[i].customer); 
    } 
} 

當前的HTML代碼

<html> 
<head> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.8.2.js"></script> 
    <script type="text/javascript" src="parser.js"></script> 
</head> 
<body> 
<table> 
    <tr> 
     <td>Order #</td> 
     <td>Delete Date</td> 
     <td>Forward</td> 
     <td>Customer</td> 
    </tr> 
    <tr> 
     <td><input id="orderNum0" type="text" /></td> 
     <td><input id="delDate0" type="text" /></td> 
     <td><input id="forw0" type="text" /></td> 
     <td><input id="customer0" type="text" /></td> 
    </tr> 
</table> 
</body> 
</html> 

以下是截圖:

http://s16.postimage.org/rd1uahm4j/localhost_ftl_parser_html.png

+0

更改成功的方法..參考我的代碼我添加了ajax調用 – DWolf

回答

0

Record.js

$(document).ready(function(){ 

$.ajax({ 
type: "GET", 
url: "record.xml", 
dataType: "xml", 
success: function(xml){ 
    parseXML(xml); 
}, 
error: function(response, textStatus, errorThrown){ 
    console.log(textStatus, errorThrown);} 
    }); 
}); 

var recordList =[]; 

function parseXML(xml) { 
$(xml).find('record').each(function() { 
var entry = new Object(); 
entry.order= $(this).find('order').text(); 
entry.delDate= $(this).find('mfg').text(); 
entry.forw = $(this).find('forw').text(); 
entry.customer = $(this).find('customer').text(); 
entry.name = $(this).find('name').text(); 
entry.item = $(this).find('item').text(); 
entry.ordered = $(this).find('ordered').text(); 
entry.warehouse = $(this).find('warehouse').text(); 
entry.destination = $(this).find('desitnation_city_state').text(); 
entry.weight = $(this).find('weight').text(); 
entry.size = $(this).find('size').text(); 

recordList.push(entry); 
}); 
send(); // handles xml after parsed 
} 

function send(){ 
// for each row of a table 
addRows(); 
for(var i = 0; i < recordList.length; i++){ 
    $('#orderNum' + i).val(recordList[i].order); 
    $('#delDate' + i).val(recordList[i].delDate); 
    $('#forw' + i).val(recordList[i].forw); 
    $('#customer' + i).val(recordList[i].customer); 
    $('#name'+i).val(recordList[i].name); 
    $('#item'+i).val(recordList[i].item); 
    $('#ordered'+i).val(recordList[i].ordered); 
    $('#warehouse'+i).val(recordList[i].warehouse); 
    $('#destination'+i).val(recordList[i].destination); 
    $('#weight'+i).val(recordList[i].weight); 
    $('#size'+i).val(recordList[i].size); 

    } 
    } 

function addRows(){ 
     for(var i = 1; i < recordList.length; i++){ 
     var newField = "<tr><td><input id=\"orderNum"+i+"\" size=\"10\" type=\"text\" </td>"+ 
         "<td><input id=\"delDate"+i+"\" size=\"10\" type=\"text\"</td>"+ 
    "<td><input id=\"forw"+i+"\" size=\"10\" type=\"text\"</td>"+ 
    "<td><input id=\"customer"+i+"\" size=\"10\" type=\"text\"</td>"+ 
    "<td><input id=\"name"+i+"\" size=\"10\" type=\"text\"</td>"+ 
    "<td><input id=\"item"+i+"\" size=\"10\" type=\"text\"</td>"+ 
    "<td><input id=\"ordered"+i+"\" size=\"10\" type=\"text\"</td>"+ 
    "<td><input id=\"warehouse"+i+"\" size=\"10\" type=\"text\"</td>"+ 
    "<td><input id=\"destination"+i+"\" type=\"text\"</td>"+ 
    "<td><input id=\"weight"+i+"\" size=\"10\" type=\"text\"</td>"+ 
    "<td><input id=\"size"+i+"\" size=\"10\" type=\"text\"</td></tr>" 

    $('#tableId').append(newField); 
     } 
    } 

Record.html

 <html> 
    <head> 
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"> 
     <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 
     <script type="text/javascript" src="http://code.jquery.com/jquery-1.8.2.js"></script> 
     <script type="text/javascript" src="records.js"></script> 
    </head> 
<body> 
<table id="tableId"> 
    <tr> 
     <td>Order #</td> 
     <td>Delete Date</td> 
     <td>Forward</td> 
     <td>Customer</td> 
    <td>Name</td> 
    <td>Item</td> 
    <td>Ordered</td> 
    <td>Warehouse</td> 
    <td>Destination</td> 
    <td>Weight</td> 
    <td>Size</td> 
</tr> 
<tr> 
    <td><input id="orderNum0" size="10" type="text" /></td> 
    <td><input id="delDate0" size="10" type="text" /></td> 
    <td><input id="forw0" size="10" type="text" /></td> 
    <td><input id="customer0" size="10" type="text" /></td> 
<td><input id="name0" size="10" type="text" /></td> 
<td><input id="item0" size="10" type="text" /></td> 
<td><input id="ordered0" size="10" type="text" /></td> 
<td><input id="warehouse0"size="10" type="text" /></td> 
<td><input id="destination0" type="text" /></td> 
<td><input id="weight0"size="10" type="text" /></td> 
<td><input id="size0" size="10" type="text" /></td> 
</tr> 
</table> 
</body> 
</html> 

只有一個問題,那就是與forw.agent和mfg.del_date的名字你的XML項..你必須轉義一些這些字符,但是這會增加行併爲這些表添加值..這是一個粗略的頁面,你可以根據需要自由地改變它們。特別是輸入框,你可以將它們更改爲標籤或你有什麼......但這解析和顯示..按要求

+0

然後爲列的打印您可以處理它但是您想要 – DWolf

+0

您會如何推薦打印列? 我試過了: $('#output')。append($(this).find('customer')。text()); 但是,這並沒有做我想做的事......我仍在學習和試驗 – user1813213

+0

你打印到網頁上嗎?或文檔? – DWolf

相關問題