【问题标题】:Replace XML-element with LINQ to XML用 LINQ to XML 替换 XML 元素
【发布时间】:2020-01-18 13:10:14
【问题描述】:

如果可能,我想使用 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>

【问题讨论】:

  • LINQ 是查询语言。它旨在从数据源中检索值,而不是修改文档。虽然使用 LINQ 肯定是可能的,但它几乎没有效率或清晰。

标签: c# xml linq xml-parsing linq-to-xml


【解决方案1】:

您要查询名称为 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 以获取演示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多