簡體   English   中英

c#LINQ-to-XML更新(保存)訂購后文件中的元素列表

[英]c# LINQ-to-XML update (save) list of elements in file after ordering

我有一個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'元素
  • 命令它由BarId下降
  • 嘗試更新/排序的xml 保存回文件。

雖然添加的元素在我保存之后位於列表中,但它在保存時不保留我在代碼中定義的順序。 這是我到目前為止(主要是工作有效代碼)

//read in the xml file
XDocument doc = XDocument.Load(...);

//add a new 'Bar' element
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));

//save file
doc.Save(...);

// note: at this point the file successfully saves (along with the 
// new 'bar' value, but the order that is set for allBars does not 
// make it back into the file.

雖然這行:

allBars = allBars.OrderByDescending(s => int.Parse(s.Element("BarId").Value));

似乎正確地對代碼中的'Bars'元素進行排序,當我將其保存回文件時,訂單不會保留。

有什么想法嗎?

您可以在調用Save方法之前執行此操作:

//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(...);

有關Remove擴展方法和Add方法的更多信息

首先,你的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
    ' to load from a file
    'xe = XElement.Load(yourpath)
    ' for testing
    doc = <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>

    doc.<Bars>.LastOrDefault.Add(<Bar>
                                     <BarId>101</BarId>
                                     <BarVal>HCESAR</BarVal>
                                 </Bar>)

    Dim ie As List(Of XElement) = doc.<Bars>.Elements.OrderBy(Function(el) Integer.Parse(el.<BarId>.Value)).ToList
    doc.<Bars>.Elements.Remove()
    doc.<Bars>.FirstOrDefault.Add(ie)
    ' to save file
    ' doc.Save(yourpath)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM