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"[]>
为什么会这样?
这是因为DocumentType
的InternalSubset
属性设置为空字符串。当它传递给底层 XmlWriter.WriteDocType
方法时,它会添加一个空的内部子集声明集合。
这仍然有效,但您可以通过将 InternalSubset
值设置为 null
:
来防止这种情况
doc.DocumentType.InternalSubset = null;
doc.Save(path);
我有一些 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"[]>
为什么会这样?
这是因为DocumentType
的InternalSubset
属性设置为空字符串。当它传递给底层 XmlWriter.WriteDocType
方法时,它会添加一个空的内部子集声明集合。
这仍然有效,但您可以通过将 InternalSubset
值设置为 null
:
doc.DocumentType.InternalSubset = null;
doc.Save(path);