XDocument - 将打开和关闭标签转换为自关闭标签

问题描述 投票:0回答:1

注意:这不是一个语义问题。这不是询问自闭合标签的含义。这是关于使用 XDocument 执行与本示例文章中使用 C# 提到的相反的操作: 一个 删除 XmlDocument 中的自关闭标签(例如 />)

在链接到不适用的重复项之前,请仔细阅读此问题。

我写这篇文章是因为我在这里和其他地方发现了很多帖子,询问如何将 C# XDocument 对象中的自关闭标签更改为具有空值的打开和关闭标签。

我想做相反的事情。我想改变这个:

<GovtID id="1"></GovtID>

对此:

<GovtID id="1"/>

我想保留之前元素中的所有属性及其值,空值除外。

这是我尝试过的最新方法:

private static void CleanUpXElements(XDocument doc)
{
    foreach (XElement childElement in
        from x in doc.DescendantNodes().OfType<XElement>()
        where x.Value == string.Empty
        select x)
    {
        childElement.ReplaceWith(new XElement(childElement.Name.LocalName, childElement.Attributes()));
    };
}

但是,当我使用这种方法时,当相关子元素以这种方式替换时,我会收到 Null 异常。

有没有一种方法可以在不引发空引用异常的情况下执行此操作?我看到元素更改为自关闭标签,但随后发生了 Null 异常。

c# xml linq-to-xml xmldocument
1个回答
0
投票

我认为您的问题可能是您在迭代文档的元素树时修改了文档的元素树,导致迭代器在尝试继续进行修改时抛出异常。

作为替代方案,您可以迭代元素,对于每个没有子元素且为空值的元素,完全删除所有子节点:

public static void CleanUpXElements(this XDocument doc)
{
    foreach (XElement childElement in
             from x in doc.Descendants()
             where !x.IsEmpty && !x.Elements().Any() && string.IsNullOrEmpty(x.Value)
             select x)
    {
        childElement.RemoveNodes();
    };
}

这可以避免在迭代元素树时修改元素树并导致

<GovtID id="1" />

演示小提琴在这里

© www.soinside.com 2019 - 2024. All rights reserved.