2012-09-10 29 views
8

最近、VS2010の小さなC#windowsフォーム/ LINQ to XMLアプリケーションが作成されましたが、 [] "をDOCTYPEタグの最後に追加します。これにより、レガシーシステムからファイルが拒否されているようです。C#LINQ TO XML - DTDヘッダーから「[]」文字を削除する

<!DOCTYPE ichicsr SYSTEM "http://www.accessdata.fda.gov/xml/icsr-xml-v2.1.dtd"> 

前にファイルが.SAVE機能を使用してプログラム内に保存された後にこれらの文字が追加されます

<!DOCTYPE ichicsr SYSTEM "http://www.accessdata.fda.gov/xml/icsr-xml-v2.1.dtd"[]> 

後:ここで前と後です。プログラムは.xmlファイルの選択を許可してから、特定のタグを削除して「クリーン」し、保存します。プロセスが開始されると、ファイルにDOCTYPEに "[]"が付きません。保存した後、彼らは行います。 LINQ to XMLはこれらを追加しますか?

これらの文字を追加しないようにする方法はありますか?

+1

それはLINQのは、自動的に何かを追加することは非常に低いです。問題の小さな例をまとめてここに投稿してみませんか? – Icarus

答えて

11

明らかに、XDocumentがドキュメントタイプ宣言を含むXMLドキュメントを解析すると、空の「内部サブセット」が存在しない場合は自動的に挿入されます。 (内部サブセットは、<!DOCTYPE>[]で囲まれた部分です)。

結果は整形式のXMLです。例のために

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

ありがとう!それはそれをしたようだ。これまでのところ、すべてのテストに合格しています。 – ewomack

+3

新しい 'XDocumentType'を作成しているときにnullを指定することはできますが、これはMono(' 2.10.9')では 'InternalSubset'にnullを割り当てることができないので、現在は動作しません。 'Info.plist'を解析/保存するとcatch-22が発生します:ファイルに' [] 'を出力すると、MonoTouchでコンパイルが失敗します。空の内部サブセットを持つ 'Info.plist'をロードすると、' [] 'が発行され、' .InternalSubset = null'を設定することはできません。そして 'XDocument.DocumentType'は読み取り専用です。私は悲しいです! – cod3monk3y

+0

私は同じことをしました(Info.plistを修正するためにmac上のmonoを使用しています)。私はあなたがXDocumentを使って作業を終えた後で、XmlDocumentを使ってDOCTYPEを修正するための適切な回避策を見つけました。私がそれを見つけだすまで、私はひどい文字列の置換をやろうとしていました。あるいは、XudReader/XmlWriterに頼っていました。 – aggieNick02

7

あなたはモノラルでこれに対処している場合(cod3monk3yのように):レガシーシステムがそれを処理できない場合は、あなたはXDocumentType.InternalSubset財産nullに設定することで、DTDから内部サブセットを削除することができます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); 
関連する問題