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>
役に立つかもしれないいくつかの参照:
他の答えは、2つの最も一般的なアプローチ、XincludeとXML外部エンティティをカバーしています。 Microsoftには、Xincludeを好む理由についての非常に優れた記事と、いくつかの実装例があります。以下の比較を引用しました:
http://msdn.Microsoft.com/en-us/library/aa302291.aspx
XIncludeを選ぶ理由
最初の質問は、「XML外部エンティティの代わりにXIncludeを使用する理由」です。答えは、XML外部エンティティには多くの既知の制限と不都合な影響があるため、それらが汎用の包含機能であることを事実上妨げているということです。具体的には:
- XML外部エンティティを完全に独立したXMLドキュメントにすることはできません。スタンドアロンのXML宣言もDoctype宣言も許可されません。つまり、XML外部エンティティ自体には他の外部エンティティを含めることはできません。
- XML外部エンティティは整形式のXMLである必要があります(一見それほど悪くはありませんが、XMLドキュメントにサンプルC#コードを含めることを想像してください)。
- 外部エンティティの読み込みに失敗すると致命的なエラーになります。回復は固く禁じられています。
- 外部エンティティ全体のみを含めることができますが、ドキュメントの一部のみを含める方法はありません。 -外部エンティティは、DTDまたは内部サブセットで宣言する必要があります。これにより、ドキュメント要素にDoctype宣言で名前を付ける必要があり、ドキュメントの完全なコンテンツモデルをDTDで定義する必要があるなど、ドキュメント要素に名前を付ける必要があるなど、含意に満ちたPandora's Boxが開きます。
XML外部エンティティを包含メカニズムとして使用することの不備は以前から知られており、実際には1999年にMicrosoftとIBMがXML包含提案をW3Cに提出しました。この提案は、汎用XML包含機能の処理モデルと構文を定義しました。
4年後、Xincludeとしても知られるXML Inclusionsのバージョン1.0は勧告候補です。つまり、W3Cは広く検討され、解決するために設定した基本的な技術的問題を満たしていると考えていますが、完全な推奨。
さまざまな実装例を提供する別の優れたサイトは、 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>