如果要删除的标签名称没有子节点,为什么我不能删除标签名称并保留其值
这是xml文件
<p>
<li>
<BibUnstructured>Some text</BibUnstructured>
</li>
<li>
<BibUnstructured>another text</BibUnstructured>
</li>
</p>
这必须是输出
<p>
<li>
Some text
</li>
<li>
another text
</li>
</p>
这是我目前的代码
XElement rootBook = XElement.Load("try.xml");
IEnumerable<XElement> Book =
from el in rootBook.Descendants("BibUnstructured").ToList()
select el;
foreach (XElement el in Book)
{
if (el.HasElements)
{
el.ReplaceWith(el.Elements());
}
Console.WriteLine(el);
}
Console.WriteLine(rootBook.ToString());
如果我删除if语句,它将删除标记名及其内容
您的BibUnstructured
元素没有子元素,但有子节点(在本例中为文本节点)。试试这个:
foreach (var book in doc.Descendants("BibUnstructured").ToList())
{
if (book.Nodes().Any())
{
book.ReplaceWith(book.Nodes());
}
}
看看这个小提琴的工作演示。
Charles 已经解释了为什么它不起作用,或者你也可以这样做。
XElement element = XElement.Load("try.xml");
element.Descendants("li").ToList().ForEach(x=> {
var item = x.Element("BibUnstructured");
if(item != null)
{
x.Add(item.Value);
item.Remove();
}
});
检查此Demo
您必须将父节点的值设置为要删除的子节点的值。尝试以下操作:
XElement rootBook = XElement.Load("try.xml");
IEnumerable<XElement> Book =
from el in rootBook.Descendants("BibUnstructured").ToList()
select el;
foreach (XElement el in Book)
{
if (!el.HasElements)
{
XElement parent= el.Parent;
string value=el.Value;
el.Remove();
parent.Value=value;
Console.WriteLine(parent);
}
}
Console.WriteLine(rootBook.ToString());
输出为:
<li>Some text</li>
<li>another text</li>
<p>
<li>Some text</li>
<li>another text</li>
</p>