【发布时间】:2019-05-10 07:56:38
【问题描述】:
我有一个 XML,它包含多个 &lt;b&gt; 标签。我想根据XElement 删除其中的一些。因此,如果XElement 是<h1>、<h2>、<h3>、<bq> 或<fc>,我想从它们各自的值中删除&lt;b&gt; 标签。
我目前正在使用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 包含
&lt;b&gt;,因为该值仅是 text 内容,而不是元素。 -
是的,这就是我提到的。相应的元素值将具有
&lt;b&gt;标签,我想从值本身中删除&lt;b&gt;标签。 -
不,我认为你错过了我的意思——如果它们出现在值的 text 中,它们就不是
&lt;b&gt;标签。它们将被表示为&lt;b&gt;或类似名称。那不是标签,它在文本节点中。这就是我要求 XML 输入和预期输出的原因。 -
哦,我知道了。但是,即使我很想使用非字符串
(XElement)方法,目前我看不到其他选择。无论如何,这是我的输入<h1><page num="3"/><b>Magie &amp; Wahrheit</b></h1>,这将是我的输出<h1><page num="3"/>Magie &amp; Wahrheit</h1>。我当然可以进行字符串替换,但我真的很想去XElement。 -
请在您的问题中填写minimal reproducible example。但我根本不希望您当前的代码对 XML 有所帮助,因为
item.Value永远不会包含&lt;b&gt;。