为什么添加这个新的XElement试图改变XML文档的结构?

本文关键字:改变 XML 文档 结构 XElement 添加 为什么 | 更新日期: 2023-09-27 18:11:28

有人说,有一只手表的人知道时间,而有两只手表的人则永远不知道时间。当谈到使用XML的选项时,我似乎有一个抽屉装满了它们。

不管怎样,我用的是。net 4。

我将原始代码替换为一个简化的测试编写函数,并将生成的XML字符串嵌入到注释中。

我试图在下面的示例XML中添加一个新的UserVar节点。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
}

为什么添加这个新的XElement试图改变XML文档的结构?

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

修改行xDoc.Add(xElement);to xDoc.Root.Element("Vars").Element("UserVars").Add(xElement);

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