将XElement添加到XML文件

时间:2014-10-21 22:27:11

标签: c# linq xelement

我使用Linq to XML将XElement添加到我的文件中。在找到此解决方案Adding XElement to XML file using Linq to XML 而我这样做。

MY XML

<?xml version="1.0" encoding="utf-8"?>
<Kostenstellen>
  <Kostenstelle id="111002">
    <Kennung>SK_5232</Kennung>
    <Kennung>HS_2322</Kennung>
    <Kennung>SK_5232</Kennung>
  </Kostenstelle>
  <Kostenstelle id="111004">
    <Kennung>SK_5232</Kennung>
  </Kostenstelle>
  <Kostenstelle id="123123">
  <Kennung>SK_2312</Kennung>
  </Kostenstelle>
</Kostenstellen>

C#

string kostenstelle = "1111111";
var costXML = XElement.Load(Settings1.Default.XMLPath);
var newChild = new XElement("Kostenstelle", new XAttribute("id", kostenstelle));
                costXML.Add(newChild);
                costXML.Save(Settings1.Default.XMLPath);

结果XML应为

<?xml version="1.0" encoding="utf-8"?>
<Kostenstellen>
  <Kostenstelle id="111002">
    <Kennung>SK_2222</Kennung>
    <Kennung>HS_2222</Kennung>
    <Kennung>SK_2222</Kennung>
  </Kostenstelle>
  <Kostenstelle id="111004">
    <Kennung>SK_2222</Kennung>
  </Kostenstelle>
  <Kostenstelle id="123123">
  <Kennung>SK_2222</Kennung>
   </Kostenstelle>
  <Kostenstelle id="111111">
  </Kostenstelle>
  </Kostenstellen>

但不幸的是,它不会有任何想法吗?

感谢您的回复

更新: 我的问题是添加过程正常。但是当我想保存更改时没有任何反应 它不会抛出异常。

 costXML.Save(Settings1.Default.XMLPath);

2 个答案:

答案 0 :(得分:0)

您似乎正在尝试添加第二个根元素,因为它是无效的XML,因此不允许这样做。您需要使用以下内容将新元素添加到<Kostenstellen>元素:

costXML.Descendants("Kostenstellen").First().Add(newChild);

答案 1 :(得分:0)

您确定添加过程正常吗?您的XElement.Load(Settings1.Default.XMLPath);没有做任何事情。根据您现在使用该代码执行的操作,这意味着您将使用单元素XML覆盖旧的XML文件。

更新:

我尝试使用您的初始XML逐行运行您的代码,并且只替换Settings1 Path变量来引用该XML。这是我的输出:

<?xml version="1.0" encoding="utf-8"?>
<Kostenstellen>
  <Kostenstelle id="111002">
    <Kennung>SK_5232</Kennung>
    <Kennung>HS_2322</Kennung>
    <Kennung>SK_5232</Kennung>
  </Kostenstelle>
  <Kostenstelle id="111004">
    <Kennung>SK_5232</Kennung>
  </Kostenstelle>
  <Kostenstelle id="123123">
    <Kennung>SK_2312</Kennung>
  </Kostenstelle>
  <Kostenstelle id="1111111" />
</Kostenstellen>

从技术上讲它应该有效。我确信它会抛出一个错误 - 没有 - 你正在进行某种类型的尝试捕获并在捕获时忽略它,当应该存在一个保存问题时。我无法想象。