2010-09-22 108 views
0

我使用DataRelationto nest tablesDataSet,得到這樣的XML結果:嵌套結果值

<Customer> 
    <Name>John</Name> 
    <Age>30</Age> 
    <Sex>Male</Sex> 
    <Order> 
     <Id>123</Id> 
     <Price>200.00</Price> 
    </Order> 
</Customer> 

我想通過組字段值的數據,如性別,以得到如下結果:

<Male> 
    <Customer> 
     <Name>John</Name> 
     <Age>30</Age> 
     <Order> 
      <Id>123</Id> 
      <Price>200.00</Price> 
     </Order> 
    </Customer> 
</Male> 

我該如何做到這一點(除了自己迭代表格和創建新表格)?

謝謝。

回答

1

如果你正在尋找一個XML輸出,你可以使用Linq-to-XML來獲得你的結果。第一步是從DataSet中生成XML。我想這將是這個樣子:

<Customers> 
    <Customer> 
     <Name>John</Name> 
     <Age>30</Age> 
     <Sex>Male</Sex> 
     <Order> 
      <Id>123</Id> 
      <Price>200.00</Price> 
     </Order> 
    </Customer> 
    <Customer> 
     <Name>Jane</Name> 
     <Age>28</Age> 
     <Sex>Female</Sex> 
     <Order> 
      <Id>124</Id> 
      <Price>100.00</Price> 
     </Order> 
    </Customer> 
    <Customer> 
     <Name>Jill</Name> 
     <Age>37</Age> 
     <Sex>Female</Sex> 
     <Order> 
      <Id>125</Id> 
      <Price>350.00</Price> 
     </Order> 
    </Customer> 
    <Customer> 
     <Name>Jack</Name> 
     <Age>34</Age> 
     <Sex>Male</Sex> 
     <Order> 
      <Id>126</Id> 
      <Price>475.00</Price> 
     </Order> 
    </Customer> 
</Customers> 

加載XML到一個XDocument,然後你可以使用LINQ來執行你的分組,並使用該結果。

XDocument document = XDocument.Parse(xml); 

var query = from customer in document.Root.Elements("Customer") 
      group customer by customer.Element("Sex").Value into sexgroup 
      select new XElement(sexgroup.Key, 
       from cust in sexgroup 
       select new XElement("Customer", 
        cust.Element("Name"), 
        cust.Element("Age"), 
        cust.Element("Order"))); 

XDocument changedOutput = new XDocument(); 
changedOutput.Add(new XElement("GroupedCustomers", query)); 

新的XDocument現在持有的結構如下:

<GroupedCustomers> 
    <Male> 
    <Customer> 
     <Name>John</Name> 
     <Age>30</Age> 
     <Order> 
     <Id>123</Id> 
     <Price>200.00</Price> 
     </Order> 
    </Customer> 
    <Customer> 
     <Name>Jack</Name> 
     <Age>34</Age> 
     <Order> 
     <Id>126</Id> 
     <Price>475.00</Price> 
     </Order> 
    </Customer> 
    </Male> 
    <Female> 
    <Customer> 
     <Name>Jane</Name> 
     <Age>28</Age> 
     <Order> 
     <Id>124</Id> 
     <Price>100.00</Price> 
     </Order> 
    </Customer> 
    <Customer> 
     <Name>Jill</Name> 
     <Age>37</Age> 
     <Order> 
     <Id>125</Id> 
     <Price>350.00</Price> 
     </Order> 
    </Customer> 
    </Female> 
</GroupedCustomers> 

編輯基於不知道什麼是在客戶元素列表(除姓名,性別等)的評論,你可以改變這個方法在查詢中稍有用處。這將基於給定的XML樣本產生與上面相同的輸出。

var query = from customer in document.Root.Elements("Customer") 
      group customer by customer.Element("Sex").Value into sexgroup 
      select new XElement(sexgroup.Key, 
       from cust in sexgroup 
       select new XElement("Customer", 
        cust.Elements().Where(ele => ele.Name.LocalName != "Sex"))); 

或者你可以簡單地選擇整個cust元素,它仍然會包括Sex標籤,當你處理記錄這可能更有意義給你。您仍然可以將它們分組,但您不會在客戶級別丟失任何信息。

var query = from customer in document.Root.Elements("Customer") 
      group customer by customer.Element("Sex").Value into sexgroup 
      select new XElement(sexgroup.Key, 
       from cust in sexgroup 
       select cust); 
+0

一個問題:在我的具體情況下,我不知道哪些字段我會爲客戶,除了我們說的名稱和性別。所以,在linq部分手動創建一個新的XElement對我來說會有點棘手。 – 2010-09-22 13:18:41

+0

@Hilton,我更新了答案以展示如何獲得所有客戶要素(我們沒有「性別」)。 – 2010-09-22 13:25:38

+0

這正是我所需要的。謝謝。 ;) – 2010-09-22 14:12:57