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

2019-06-28 03:42发布

我最近建立了一个小的C#Windows窗体/ LINQ到XML的应用程序在VS2010这也正是它应该做的,除了一两件事:它增加了“[]”的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到XML添加这些?

有什么办法让从添加这些字符的程序?

Answer 1:

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

结果是格式良好的XML。 但是,如果你的遗留系统不能处理它,你可以通过设置除去从DTD内部子集XDocumentType.InternalSubset属性为null

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


Answer 2:

如果你在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);


文章来源: C# LINQ TO XML - Remove “[]” characters from the DTD header