C# c LINQ到XML在排序后更新(保存)文件中的元素列表
我有这样一个XML文件:C# c LINQ到XML在排序后更新(保存)文件中的元素列表,c#,xml,linq,linq-to-xml,xelement,C#,Xml,Linq,Linq To Xml,Xelement,我有这样一个XML文件: <?xml version="1.0" encoding="utf-8"?> <FooMgr> <BlargDate>2017-03-06 10:26:21</BlargDate> <Bars> <Bar> <BarId>222</BarId> <BarVal>QWERTY</B
<?xml version="1.0" encoding="utf-8"?>
<FooMgr>
<BlargDate>2017-03-06 10:26:21</BlargDate>
<Bars>
<Bar>
<BarId>222</BarId>
<BarVal>QWERTY</BarVal>
</Bar>
<Bar>
<BarId>77</BarId>
<BarVal>DVORAK</BarVal>
</Bar>
<Bar>
<BarId>9999</BarId>
<BarVal>AZERTY</BarVal>
</Bar>
</Bars>
</FooMgr>
似乎对代码中的“bar”元素进行了正确排序,当我将其保存回文件时,顺序不会持久化
有什么想法吗?您可以在调用保存方法之前执行此操作:
关于扩展方法和方法的更多信息首先,您的xml无效,请选择正确的方法:
<?xml version="1.0" encoding="utf-8"?>
<FooMgr>
<BlargDate>2017-03-06 10:26:21</BlargDate>
<Bars>
<Bar>
<BarId>222</BarId>
<BarVal>QWERTY</BarVal>
</Bar>
<Bar>
<BarId>77</BarId>
<BarVal>DVORAK</BarVal>
</Bar>
<Bar>
<BarId>9999</BarId>
<BarVal>AZERTY</BarVal>
</Bar>
</Bars>
</FooMgr>
您的allBars只是一个节点集合,它不属于任何节点,因此您需要将其挂在Bars下,我建议首先删除其中的所有项目:
XElement bar1 = new XElement("Bar",
new XElement("BarId", 101),
new XElement("BarVal", "HCESAR"));
doc.Element("FooMgr").Element("Bars").Add(bar1);
//sort descending by BarId
IEnumerable<XElement> allBars = doc.Descendants("FooMgr")
.Select(x => x.Element("Bars"))
.Descendants("Bar")
.ToArray();
allBars = allBars.OrderByDescending(s => int.Parse(s.Element("BarId").Value));
doc.Element("FooMgr").Element("Bars").RemoveAll();
doc.Element("FooMgr").Element("Bars").Add(allBars);
在VB中,这将是
Dim doc As XElement
'从文件加载
'xe=XElement.Loadyourpath
"测试",
文件=
2017-03-06 10:26:21
222
QWERTY
77
德沃夏克
9999
阿泽蒂
doc..LastOrDefault.Add
101
HCESAR
Dim ie作为ListOf XElement=doc..Elements.OrderByFunctionel Integer.Parseel..Value.ToList
doc..Elements.Remove
doc..FirstOrDefault.Addie
'保存文件
“博士,保存你的路径
@Dispersia,引用OP:但是为allBars设置的顺序并没有返回到文件中。@Octaviccl这正是我要找的,并且工作正常。谢谢!@如果我的问题有点含糊,我很抱歉。显然,@russellelbert认为这就是解决办法;我不明白你在做什么,抱歉。编辑你的答案,这样我就可以删除否决票;哎呀,很抱歉XML无效-我在“为简洁起见复制/粘贴/编辑”条目上有点松懈。。我很快会更新的。你发布的代码是我需要的,但是octavioccl抢先找到了答案。非常感谢。
//Remove bar elements from your doc
doc.Element("FooMgr").Element("Bars").Elements("Bar").Remove();
//Add the ordered bar nodes
doc.Element("FooMgr").Element("Bars").Add(allBars);
//save file
doc.Save(...);
<?xml version="1.0" encoding="utf-8"?>
<FooMgr>
<BlargDate>2017-03-06 10:26:21</BlargDate>
<Bars>
<Bar>
<BarId>222</BarId>
<BarVal>QWERTY</BarVal>
</Bar>
<Bar>
<BarId>77</BarId>
<BarVal>DVORAK</BarVal>
</Bar>
<Bar>
<BarId>9999</BarId>
<BarVal>AZERTY</BarVal>
</Bar>
</Bars>
</FooMgr>
XElement bar1 = new XElement("Bar",
new XElement("BarId", 101),
new XElement("BarVal", "HCESAR"));
doc.Element("FooMgr").Element("Bars").Add(bar1);
//sort descending by BarId
IEnumerable<XElement> allBars = doc.Descendants("FooMgr")
.Select(x => x.Element("Bars"))
.Descendants("Bar")
.ToArray();
allBars = allBars.OrderByDescending(s => int.Parse(s.Element("BarId").Value));
doc.Element("FooMgr").Element("Bars").RemoveAll();
doc.Element("FooMgr").Element("Bars").Add(allBars);