LINQ to XML XDocument 在保存时更改 DOCTYPE

LINQ to XML XDocument changes DOCTYPE on save

我有一些 xml 开头有以下 DOCTYPE 声明:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE setup SYSTEM "setup.dtd">

我的代码处理 xml 或多或少是这样的:

XDocument doc = XDocument.Load(path);
doc.Element("foo")
             .Element("bar")
             .Elements()
             .Attributes()
             .Where(x => x.Name == "some" && x.Value == some)
             .Single()
             .Parent
             .SetValue(newValue);
doc.Save(path);

代码更改其结构中某些 xml 节点的值。令人惊讶的是它也影响 DOCTYPE 并且在操作之后它看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE setup SYSTEM "setup.dtd"[]>

为什么会这样?

这是因为DocumentTypeInternalSubset属性设置为空字符串。当它传递给底层 XmlWriter.WriteDocType 方法时,它会添加一个空的内部子集声明集合。

这仍然有效,但您可以通过将 InternalSubset 值设置为 null:

来防止这种情况
doc.DocumentType.InternalSubset = null;
doc.Save(path);