为什么添加这个新的XElement会尝试更改XML文档的结构?

时间:2013-04-29 18:48:41

标签: c# .net linq-to-xml

他们说一个有一只手表的男人知道现在是什么时候,一个有两个人的男人永远不确定。当谈到使用XML的选项时,我似乎有一个装满它们的抽屉。

我正在使用.Net 4。

我用简单的测试写入函数替换了原始代码,并将生成的XML字符串嵌入为注释。

我正在尝试将新的UserVar节点添加到下面的示例XML中。 XML来自商业计划,我对其设计没有任何意见。

当我尝试添加新条目时,我会在xDoc.Save()

期间收到异常
  

此操作会创建错误构造的文档。

理论上我正在创建一个XElement,其中包含与原始结构相匹配的子项,并尝试将其添加到现有文档中。从其他问题和例子中可以看出其他人正在做的事情。

我的代码在XML下面。该函数创建一个要添加到文档中的XElement。

XML

<?xml version="1.0" encoding="UTF-8"?>
<Application>
  <Vars>
    <UserVars>
      <UserVar>
        <Name>"Quantity"</Name>
        <Width>4</Width>
        <VarValue>"1"</VarValue>
      </UserVar>
      <UserVar>
        <Name>"Printers"</Name>
        <Width>255</Width>
      </UserVar>
      <UserVar>
        <Name>"Changed"</Name>
        <Width>1</Width>
      </UserVar>
      <UserVar>
        <Name>"Weight"</Name>
        <VarValue>"450.1"</VarValue>
      </UserVar>
    </UserVars>
  </Vars>
</Application>

代码

public static void TestWriteData(string xmlDocNm)
{
  // Write a test value to an Acme UserVar in the exisiting XML
  var xDoc = XDocument.Load(xmlDocNm); //This is your xml path value 

  XElement xVar = new XElement("UserVar");

  // In this company's XML the strings have double quotes around them
  xVar.Add((new XElement("Name", "\"Title\"")));
  xVar.Add(new XElement("VarValue", "\"Paradise Lost\""));

  XElement xElement = new XElement("Application",
    new XElement("Vars",
    new XElement("UserVars",
    xVar)));

  // XML Data in xElement - String data copied from the IDE watch
  //<Application>
  //  <Vars>
  //    <UserVars>
  //      <UserVar>
  //        <Name>"Title"</Name>
  //        <VarValue>"Paradise Lost"</VarValue>
  //      </UserVar>
  //    </UserVars>
  //  </Vars>
  //</Application>

  xDoc.Add(xElement);
  xDoc.Save(xmlDocNm); //Write the XML back to the file
}

1 个答案:

答案 0 :(得分:2)

代码正在尝试添加第二个根元素。

更改第xDoc.Add(xElement);行 到xDoc.Root.Element("Vars").Element("UserVars").Add(xElement);

但在此之前,请删除您创建<Application>元素的代码。只需创建/输出<UserVar>元素即可。