如何在C#中使用LINQ替换XElement值?

时间:2019-05-10 07:56:38

标签: c# .net xml linq foreach

我有一个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;

有可能吗?

1 个答案:

答案 0 :(得分:1)

您的代码似乎很好。(如果您知道自己在做什么)

不过,想看一下xml的结构。

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

似乎<b><h1>(及其他)的直接子代,您正在替换值(值中还带有<b>标记)

我希望你的结构有点像

<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)));