C# c LINQ到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文件:

<?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);