9

私は最近、VS2010で小さなC#Windowsフォーム/ LINQto 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プロパティをnull次のように設定することで、DTDから内部サブセットを削除できます。

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

Info.plistの変更などの場合にMono(cod3monk3yなど)でこれを処理している場合は、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 に答える