C#LINQ TO XML – 从DTD标题中删除“”字符

我最近在VS2010中创建了一个小的C#windows窗体/ LINQ to XML应用程序,完全按照它应该做的,除了一件事:它在DOCTYPE标记的末尾添加“[]”,这显然导致文件遗留系统拒绝。 这是一个前后:

之前

 

  

使用.Save函数将文件保存在程序中后,将添加这些字符。 该程序允许选择.xml文件,然后通过删除某些标签“清除”它,然后保存它。 进程开始时,文件在DOCTYPE中没有“[]”。 保存后,他们会这样做。 LINQ to XML是否添加了这些?

有没有办法让程序不添加这些字符?

显然,当XDocument解析包含文档类型声明的XML文档时,如果不存在空的“内部子集”,则会自动插入。 (内部子集是[]包围的部分。

结果是格式良好的XML。 但是,如果旧系统无法处理它,则可以通过将XDocumentType.InternalSubset属性设置为null来从DTD中删除内部子集:

 XDocument document = ...; if (document.DocumentType != null) document.DocumentType.InternalSubset = null; 

如果您正在使用Mono(如cod3monk3y)处理此问题,例如修改Info.plist,则可以使用旧的XmlDocument类在使用XDocument创建/修改xml文件后进行修复。

代码假定您的“Info.plist”文件位于路径infoPlist:

 using System; using System.IO; using System.Linq; using System.Xml; using System.Xml.Linq; var xDocument = XDocument.Load (infoPlist); // Do your manipulations here xDocument.Save (infoPlist); XmlDocument xmlDocument = new XmlDocument(); xmlDocument.Load (infoPlist); if (xmlDocument.DocumentType != null) { var name = xmlDocument.DocumentType.Name; var publicId = xmlDocument.DocumentType.PublicId; var systemId = xmlDocument.DocumentType.SystemId; var parent = xmlDocument.DocumentType.ParentNode; var documentTypeWithNullInternalSubset = xmlDocument.CreateDocumentType(name, publicId, systemId, null); parent.ReplaceChild(documentTypeWithNullInternalSubset, xmlDocument.DocumentType); } xmlDocument.Save (infoPlist);