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

时间:2012-09-10 19:17:57

标签: c# xml visual-studio-2010 linq-to-xml

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

<!DOCTYPE ichicsr SYSTEM "http://www.accessdata.fda.gov/xml/icsr-xml-v2.1.dtd">

<!DOCTYPE ichicsr SYSTEM "http://www.accessdata.fda.gov/xml/icsr-xml-v2.1.dtd"[]>

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

有没有办法阻止程序添加这些字符?

2 个答案:

答案 0 :(得分:14)

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

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

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

答案 1 :(得分:8)

如果您正在使用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);