【问题标题】:How do I replace XElement values using LINQ in C#?如何在 C# 中使用 LINQ 替换 XElement 值?
【发布时间】:2019-05-10 07:56:38
【问题描述】:

我有一个 XML,它包含多个 <b> 标签。我想根据XElement 删除其中的一些。因此,如果XElement<h1><h2><h3><bq><fc>,我想从它们各自的值中删除<b> 标签。

我目前正在使用foreach 来执行此操作,并且它有效,但我只想选择一个LINQ

这是我的代码:

foreach (var item in xdoc.Descendants("h1"))
{
    if (item.Elements("b").Count() > 0)
    {
        itemvalue = item.Value.Replace("<b>", String.Empty).Replace("</b>",String.Empty);
        item.SetValue(itemvalue);
    }
}
foreach (var item in xdoc.Descendants("h2"))
{
    if (item.Elements("b").Count() > 0)
    {
        itemvalue = item.Value.Replace("<b>", String.Empty).Replace("</b>",String.Empty);
        item.SetValue(itemvalue);
    }
}
foreach (var item in xdoc.Descendants("h3"))
{
    if (item.Elements("b").Count() > 0)
    {
        itemvalue = item.Value.Replace("<b>", String.Empty).Replace("</b>",String.Empty);
        item.SetValue(itemvalue);
    }
}
foreach (var item in xdoc.Descendants("bq"))
{
    if (item.Elements("b").Count() > 0)
    {
        itemvalue = item.Value.Replace("<b>", String.Empty).Replace("</b>",String.Empty);
        item.SetValue(itemvalue);
    }
}
foreach (var item in xdoc.Descendants("fc"))
{
    if (item.Elements("b").Count() > 0)
    {
        itemvalue = item.Value.Replace("<b>", String.Empty).Replace("</b>",String.Empty);
        item.SetValue(itemvalue);
    }
}

我想要类似的东西:

xdoc.Descendants().Where(el => (el.Name.LocalName == "h1" || el.Name.LocalName == "h2" || el.Name.LocalName == "h3"
                            || el.Name.LocalName == "bq" || el.Name.LocalName == "fc") && el.Value.Contains("</b>"))...Replace;

有可能吗?

【问题讨论】:

  • 请您发布示例输入 XML 和所需的输出?我很惊讶元素 value 包含 &amp;lt;b&amp;gt;,因为该值仅是 text 内容,而不是元素。
  • 是的,这就是我提到的。相应的元素值将具有&amp;lt;b&amp;gt; 标签,我想从值本身中删除&amp;lt;b&amp;gt; 标签。
  • 不,我认为你错过了我的意思——如果它们出现在值的 text 中,它们就不是 &amp;lt;b&amp;gt; 标签。它们将被表示为&amp;lt;b&amp;gt; 或类似名称。那不是标签,它在文本节点中。这就是我要求 XML 输入和预期输出的原因。
  • 哦,我知道了。但是,即使我很想使用非字符串 (XElement) 方法,目前我看不到其他选择。无论如何,这是我的输入&lt;h1&gt;&lt;page num="3"/&gt;&lt;b&gt;Magie &amp;amp; Wahrheit&lt;/b&gt;&lt;/h1&gt;,这将是我的输出&lt;h1&gt;&lt;page num="3"/&gt;Magie &amp;amp; Wahrheit&lt;/h1&gt;。我当然可以进行字符串替换,但我真的很想去XElement
  • 请在您的问题中填写minimal reproducible example。但我根本不希望您当前的代码对 XML 有所帮助,因为 item.Value 永远不会包含 &amp;lt;b&amp;gt;

标签: c# .net xml linq foreach


【解决方案1】:

您的代码似乎没问题。(如果您知道自己在做什么)

不过,想看看你的 xml 的结构。

无论如何,目前,通过查看您的代码

似乎&lt;b&gt;&lt;h1&gt;(和其他人)的直接子代,而您正在替换该值(其中也有&lt;b&gt; 标签)

我希望你的结构有点像

<h1>
    <b><b>xyz</b></b>
</h1>

那么它就会给

<h1>
    <b>xyz</b>
<h1>

Linq

也许这会起作用......

 srcTree.Descendants().Where(el => (el.Name.LocalName == "h1" || el.Name.LocalName == "h2" || el.Name.LocalName == "h3"
                            || el.Name.LocalName == "bq" || el.Name.LocalName == "fc") && el.Value.Contains("</b>")).Select(x => x).ToList().ForEach(x => x.SetValue(x.Value.Replace("<b>", String.Empty).Replace("</b>", String.Empty)));

【讨论】:

  • 我不会得到&lt;b&gt;&lt;b&gt; 的情况,但我明白你的意思。另外,有没有办法使用单个 LINQ 来做到这一点?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-14
  • 1970-01-01
相关资源
最近更新 更多