9

我最近在 VS2010 中创建了一个小型 C# windows 窗体/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 是否添加了这些?

有什么办法可以阻止程序添加这些字符?

4

2 回答 2

15

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

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

XDocument document = ...;
if (document.DocumentType != null)
    document.DocumentType.InternalSubset = null;
于 2012-09-10T19:38:32.273 回答
9

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

该代码假定您的“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);
于 2013-05-08T23:17:50.000 回答