2017-03-06 23 views
3

後,我有一個XML文件,例如:C#LINQ到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> 

和我:

  • 閱讀它
  • 添加「酒吧」元素
  • 責令由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)); 

似乎在「酒吧」在代碼元素正確排序,當我回來將它保存到文件的順序不會持久。

有什麼想法?

回答

3

你可以做到這一點,你打電話之前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方法

+0

Downvoter你能解釋一下爲什麼? – octavioccl

+0

@Dispersia,引用OP:「但是爲allBars設置的順序不是 使其重新回到文件中。」 – octavioccl

+0

@octavioccl這正是我所期待的,並按預期工作。謝謝! @ Dispersia對不起,如果我的問題有點模糊 – russellelbert

1

首先,你的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只是它不屬於任何節點的節點的集合,所以您需要將它掛起[R酒吧,我建議首先刪除所有的項目有:

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); 
+0

哎呀,對於無效的XML感到抱歉 - 我爲了簡潔而對複製/粘貼/編輯進行了一番懈怠..我會盡快更新它。你發佈的代碼是我需要的,但是八卦網站毆打你的答案。謝謝! – russellelbert

0

在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)