![](/img/trans.png)
[英]Read and Remove invalid characters from xml outside xml elements in C# Linq to Xml
[英]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.