簡體   English   中英

C#LINQ TO XML - 從DTD標題中刪除“[]”字符

[英]C# LINQ TO XML - Remove “[]” characters from the DTD header

我最近在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是否添加了這些?

有沒有辦法讓程序不添加這些字符?

顯然,當XDocument解析包含文檔類型聲明的XML文檔時,如果不存在空的“內部子集”,則會自動插入。 (內部子集是<!DOCTYPE>[]包圍的部分。

結果是格式良好的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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM