2015-05-29 24 views
-2

Workign 我的XML如下:如何reoder XML的重新排序的XML

<Subjects> 
    <Subject> 
    <Name></Name> 
    <Height></Height> 
    <Addresss> 
     <Address> 
      <City>AB</City> 
     </Address> 
    </Addresses> 
    </Subject> 
    <Subject> 
    <Name></Name> 
    <Height></Height> 
    <Addresss> 
     <Address> 
      <City>CD</City> 
     </Address> 
    </Addresses> 
    </Subject> 
</Subjects> 

現在我想創造XML通過增加地址參考題目如下

<Order> 
<Subjects> 
    <Subject> 
    <Name></Name> 
    <Height></Height> 
    <Address ref="A1"/> 
    </Subject> 
    <Subject> 
    <Name></Name> 
    <Height></Height> 
    <Address ref="A2"/>  
    </Subject> 
</Subjects> 
<Addresss> 
    <Address id="A1"> 
     <City>AB</City> 
     </Address>  
     <Address id="A2"> 
     <City>AB</City> 
     </Address> 
    </Addresses> 
</Order> 

哪有我用SQL或LINQ完成了這個任務嗎?

+0

第二個是不是有效的XML 。你不能有兩個根節點。此外,不是很好的使用SQL,這不是LINQ專門設計的。 LINQ可能是解決方案的一部分,但您並未嘗試查詢數據(LINQ中的Q),您正試圖修改它。 –

+0

對不起我想念父節點 .. 我想重新排列xml .. – user1893874

回答

0

使用XmlDocument類,你可以使用ImportNode方法將元素從一個文檔轉移到另一個,象下面這樣:

var index  = 0; 
var output = new XmlDocument(); 
var order  = output.AppendChild(output.CreateElement("Order" )); 
var subjects = order .AppendChild(output.CreateElement("Subjects")); 
var addresses = order .AppendChild(output.CreateElement("Addresses")); 
foreach (XmlElement subject in input.SelectNodes("/Subjects/Subject")) 
{ 
    index++; 

    var address = (XmlElement)subject.RemoveChild(subject.SelectSingleNode("Addresses")); 
     address = (XmlElement)address.FirstChild; // Addresses to Address 
     address.SetAttribute("id", index.ToString()); 

    var newAddress = (XmlElement)subject.AppendChild(input.CreateElement("Address")); 
     newAddress.SetAttribute("ref", index.ToString()); 

    subjects .AppendChild(output.ImportNode(subject, true)); 
    addresses.AppendChild(output.ImportNode(address, true)); 
} 

output.Save(Console.Out); 
Console.ReadLine(); 
+0

謝謝..漂亮的代碼...你讓我的一天.. – user1893874

0

使用XML LINQ

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string input = 
      "<Subjects>" + 
       "<Subject>" + 
       "<Name></Name>" + 
       "<Height></Height>" + 
       "<Addresses>" + 
        "<Address>" + 
         "<City>AB</City>" + 
        "</Address>" + 
       "</Addresses>" + 
       "</Subject>" + 
       "<Subject>" + 
       "<Name></Name>" + 
       "<Height></Height>" + 
       "<Addresses>" + 
        "<Address>" + 
         "<City>CD</City>" + 
        "</Address>" + 
       "</Addresses>" + 
       "</Subject>" + 
      "</Subjects>"; 

      XDocument doc = XDocument.Parse(input); 

      foreach (XElement subject in doc.Descendants("Subject")) 
      { 
       string address = subject.Element("Addresses").Element("Address").Element("City").Value; 
       XElement newAddress = new XElement("Address"); 
       XAttribute newAttribute = new XAttribute("ref", address); 
       newAddress.Add(newAttribute); 
       subject.Add(newAddress); 
       subject.Element("Addresses").Remove(); 
      } 
     } 
    } 
} 
​