2010-07-26 70 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%确定的输入,请检查元素。