XMLファイルを別のXMLファイルにインポートできますか?
つまり、XMLパスをパラメーターとして受け取り、XML(パスが指定されている)をインポートするインポートタグがXMLにあります。
回答:
次のようにエンティティを宣言します。
<!ENTITY otherFile SYSTEM "otherFile.xml">
次に、次のように参照します。
&otherFile;
完全な例:
<?xml version="1.0" standalone="no" ?>
<!DOCTYPE doc [
<!ENTITY otherFile SYSTEM "otherFile.xml">
]>
<doc>
<foo>
<bar>&otherFile;</bar>
</foo>
</doc>
XMLパーサーがファイルを読み取ると、エンティティ参照が展開され、参照されたXMLファイルがコンテンツの一部として含まれます。
「otherFile.xml」に含まれている場合: <baz>this is my content</baz>
次に、XMLは、XMLパーサーによって次のように評価および「表示」されます。
<?xml version="1.0" standalone="no" ?>
<doc>
<foo>
<bar><baz>this is my content</baz></bar>
</foo>
</doc>
役立つかもしれないいくつかの参考文献:
XMLResolver
プロパティが何に設定されているかを確認する必要がある場合があります。XMLResolverプロパティがXMLDocumentオブジェクトに設定されていない場合、外部リソースをロードしない可能性があります。msdn.microsoft.com/en-us/library/5fcwybb2.aspx
他の回答は、XincludeとXML外部エンティティという2つの最も一般的なアプローチをカバーしています。Microsoftは、Xincludeを好む理由と、いくつかの実装例について非常に優れた記事を書いています。以下に比較を引用しました:
http://msdn.microsoft.com/en-us/library/aa302291.aspxごと
なぜXInclude?
最初の質問は、「XML外部エンティティの代わりにXIncludeを使用する理由」です。その答えは、XML外部エンティティには多くのよく知られた制限と不便な影響があり、それらが汎用の包含機能になることを事実上妨げているということです。具体的には:
- XML外部エンティティを本格的な独立したXMLドキュメントにすることはできません。スタンドアロンのXML宣言もDoctype宣言も許可されていません。つまり、事実上、XML外部エンティティ自体に他の外部エンティティを含めることはできません。
- XML外部エンティティは整形式のXMLである必要があります(一見悪くはありませんが、サンプルのC#コードをXMLドキュメントに含めたいと想像してください)。
- 外部エンティティのロードに失敗すると、致命的なエラーになります。いかなる回復も固く禁じられています。
- 外部エンティティ全体のみを含めることができ、ドキュメントの一部のみを含める方法はありません。-外部エンティティは、DTDまたは内部サブセットで宣言する必要があります。これにより、ドキュメント要素をDoctype宣言で指定する必要があることや、リーダーを検証するためにドキュメントの完全なコンテンツモデルをDTDで定義する必要があることなど、影響に満ちたパンドラの箱が開きます。
XML外部エンティティを包含メカニズムとして使用することの欠陥は以前から知られており、実際、1999年にMicrosoftとIBMによってW3CへのXML包含提案の提出を生み出しました。この提案では、汎用XML包含機能の処理モデルと構文を定義しました。
4年後、Xincludeとしても知られるXMLインクルージョンのバージョン1.0は、候補の推奨事項です。つまり、W3Cは、広くレビューされ、解決しようとしている基本的な技術的問題を満たしていると信じていますが、まだ完全な推奨。
さまざまな実装例を提供するもう1つの優れたサイトは、https://www.xml.com/pub/a/2002/07/31/xinclude.htmlです。以下は、彼らのサイトからの一般的なユースケースの例です。
<book xmlns:xi="http://www.w3.org/2001/XInclude">
<title>The Wit and Wisdom of George W. Bush</title>
<xi:include href="malapropisms.xml"/>
<xi:include href="mispronunciations.xml"/>
<xi:include href="madeupwords.xml"/>
</book>
Mads Hansenのソリューションは優れていますが、.NET 4で外部ファイルを正常に読み取るには、リゾルバーやProhibitDTDなどに関するコメントのヒントを使用して理解するのに時間がかかりました。
これはそれが行われる方法です:
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse;
XmlUrlResolver resolver = new XmlUrlResolver();
resolver.Credentials = System.Net.CredentialCache.DefaultCredentials;
settings.XmlResolver = resolver;
var reader = XmlReader.Create("logfile.xml", settings);
XmlDocument doc = new XmlDocument();
doc.Load(reader);
foreach (XmlElement element in doc.SelectNodes("//event"))
{
var ch = element.ChildNodes;
var count = ch.Count;
}
logfile.xml:
<?xml version="1.0"?>
<!DOCTYPE logfile [
<!ENTITY events
SYSTEM "events.txt">
]>
<logfile>
&events;
</logfile>
events.txt:
<event>
<item1>item1</item1>
<item2>item2</item2>
</event>