【问题标题】:Why does C# leave unclosed tags in XDocument? [duplicate]为什么 C# 在 XDocument 中留下未闭合的标签? [复制]
【发布时间】:2018-05-19 15:27:41
【问题描述】:

我有一个如下所示的 XDocument:

<?xml version="1.0"?>
<notebook>
    <note>
        <person>
            <surname>Che Guevara</surname>
            <name>Ernesto</name>
            <birthdate>1926</birthdate>
            <telephones>
                <telephone>79626195740</telephone>
            </telephones>
        </person>
    </note>
    <note>
        <person>
            <surname>Castro</surname>
            <name>Fidel</name>
            <birthdate>1926</birthdate>
            <telephones>
                <telephone>79626195740</telephone>
                <telephone>79636296751</telephone>
            </telephones>
        </person>
    </note>
</notebook>

而且我需要删除所有节点“note”,所以我使用

xd.Element("notebook").Elements("note").Remove();

我不明白为什么这个方法会让我的 .xml 文件变成这样

<?xml version="1.0" encoding="utf-8"?>
<notebook />

为什么不能正常工作?

【问题讨论】:

  • &lt;notebook /&gt; 等于 &lt;notebook&gt;&lt;/notebook&gt;
  • 不是未封闭的标签;这是一个自封闭标签。如果您不想要自闭合标记,请使用模式告诉 .NET 它不是自闭合标记,或使用副本中概述的技术。

标签: c# xml-parsing


【解决方案1】:

它工作正常,您所指的notebook元素称为“自闭合元素”。 在使用 XDocument 时,&lt;notebook /&gt;&lt;notebook&gt;&lt;/notebook&gt; 的含义相同,但这可能会导致其他 XML 解析器出现问题,其中一些解析器可能无法识别 &lt;notebook /&gt;。 XDocument 可能会生成自闭合元素,因为它们要小得多,从而节省空间。

【讨论】:

  • 然而,就 XML 而言,它不是“相等的”,因为定义(模式或文档类型)控制它是否是自关闭的。请注意,根据该定义,符合标准的解析器可以拒绝&lt;notebook /&gt;,同时接受&lt;notebook&gt;&lt;/notebook&gt;
  • @MikeMcCaughan 谢谢,我会将其添加到我的答案中。
  • 哦,我对我的任务感到困惑。我在你的帮助下做到了。感谢您的快速回答!
  • @MikeMcCaughan 引用?我不记得使用 XSD 你可以做到...因为我在 SO 中看到了一个 response,它说相反
  • 嗯,XSD 没有正式定义空元素和自闭合元素的方法是正确的,但是很多解析器都有一些怪癖。参见例如this answer。 DTD 可以影响元素是否自闭合。请参阅this answer 就同一问题。现在,这个问题特定于 PHP 的 XML(HTML?)解析器,但我希望其他解析器也有类似的怪癖。因此我的评论。
猜你喜欢
  • 2013-05-03
  • 1970-01-01
  • 2023-01-10
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多