为什么可以';t我使用linq to xml删除标记名

本文关键字:xml to linq 删除 为什么 | 更新日期: 2023-09-27 17:58:21

如果要删除的标签名称没有子节点,为什么我不能删除标签名称并保留其值

这是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语句,它将删除标记名及其内容

为什么可以';t我使用linq to xml删除标记名

您的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>