2017-03-06 22 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)