2010-07-26 71 views
2

如何排序xml文件中的節點並使用linq以排序順序保存文件?使用linq排序xml文件

如果這是我的xml文件,

<Persons> 
    <Person> 
    <id>2</id> 
    <Name>xxx</Name> 
    </Person> 
    <Person> 
    <id>3</id> 
    <Name>yyy</Name> 
    </Person> 
</Persons> 

插入新節點時, 應該作爲插入這樣。

<Persons> 
      <Person> 
      <id>1</id> 
      <Name>zzz</Name> 
      </Person> 
      <Person> 
      <id>2</id> 
      <Name>xxx</Name> 
      </Person> 
      <Person> 
      <id>3</id> 
      <Name>yyy</Name> 
      </Person> 
    </Persons> 

如何使用linq做到這一點?

謝謝

+0

您能否使用答案或者有什麼不清楚的地方?問候 – 2010-07-28 00:15:02

回答

4

像下面這樣。如果你不是100%確定的輸入,你應該正確使用int.TryParse來代替int.Parse和其他一些檢查(對於特定的元素等)。或者根據模式檢查它。

(我已經添加與ID = 1我想你忘了添加它的結束一個人。)

var doc = XDocument.Parse(@"<Persons> 
<Person> 
<id>2</id> 
<Name>xxx</Name> 
</Person> 
<Person> 
<id>3</id> 
<Name>yyy</Name> 
</Person> 
<Person> 
<id>1</id> 
<Name>some name</Name> 
</Person> 
</Persons>"); 

//By building a new XDocument 
var newDoc = new XDocument(new XElement("Persons", 
       from p in doc.Element("Persons").Elements("Person") 
       orderby int.Parse(p.Element("id").Value) 
       select p)); 
//or by changing the original XDocument (does not change it where you got it from - a file etc.): 

doc.Root.ReplaceAll(from p in doc.Root.Elements("Person") 
        orderby int.Parse(p.Element("id").Value) 
        select p); 

以及加載/保存您可以使用:

var doc = XDocument.Load("filename"); //Or use a stream etc. 
newDoc.Save("filename"); //Or save to a stream etc. 

你可以使用:的

doc.Root 

代替:

doc.Element("Persons") 

但是,如果您不是100%確定的輸入,請檢查元素。