将 XML-element 替换为 LINQ to XML

Replace XML-element with LINQ to XML

如果可能,我想 使用 LINQ to XML 解决以下问题。使用 LINQ to XML 可能不是解决此类问题的合适方法?如果不是,最好的技术是什么?所有元素都是这样的:

<Name>XXX</Name>

应替换为:

<Attribute name="Name">XXX</Attribute>

在下面XML?

  <Object type="SignalGroup">
    <Name>General</Name>
    <Object type="Signal">
      <Name>Input</Name>
      <Attribute name="Description">This is a public object.</Attribute>
    </Object>
    <Object type="Signal">
      <Name>PublicName</Name>
      <Attribute name="ToolTitle">Public name</Attribute>
      <Attribute name="Description">This is a public object.</Attribute>
    </Object>
  </Object>

期望的结果是:

  <Object type="SignalGroup">
    <Attribute name="Name">General</Attribute>
    <Object type="Signal">
      <Attribute name="Name">Input</Attribute>
      <Attribute name="Description">This is a public object.</Attribute>
    </Object>
    <Object type="Signal">
      <Attribute name="Name">PublicName</Attribute>
      <Attribute name="ToolTitle">Public name</Attribute>
      <Attribute name="Description">This is a public object.</Attribute>
    </Object>
  </Object>

您想查询名称为 Name 的所有元素,或者 重命名该元素并添加缺少的属性, 将它们替换为具有该元素值的 Attribute 元素。

所以要么这样:

foreach (var name in doc.Descendants("Name"))
{
    name.Name = "Attribute";
    name.Add(new XAttribute("name", "Name"));
}

或者这个。请注意,此处需要 ToList,因为替换该元素会破坏枚举,因为您将从文档中删除了当前元素。

foreach (var name in doc.Descendants("Name").ToList())
{
    var attr = new XElement("Attribute",
        new XAttribute("name", "Name"), name.Value);
    name.ReplaceWith(attr);
}

有关演示,请参阅 this fiddle