XMLファイルを別のXMLファイルにインポートできますか?


83

XMLファイルを別のXMLファイルにインポートできますか?

つまり、XMLパスをパラメーターとして受け取り、XML(パスが指定されている)をインポートするインポートタグがXMLにあります。

回答:


93

外部(解析済み)の一般エンティティを使用できます。

次のようにエンティティを宣言します。

<!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>

役立つかもしれないいくつかの参考文献:


1
こんにちはマッド、私はこれで立ち往生しています、何が起こっているのですか?IEでmain.xmlファイルを表示すると、otherFile.xmlのテキストが正しく取得されますが、アプリケーションで同じ概念を使用してxmlをXMLDocumentにロードすると.netの場合、otherFile.xmlのテキストを取得できません。代わりに、main.xmlに記述されているすべての<?xml version = "1.0" standalone = "no"?> <!DOCTYPE doc [<! ENTITY otherFile SYSTEM "otherFile.xml">]> <doc> <foo> <bar>&otherFile; </ bar> </ foo> </ doc>何か他のことをして自分にロードする必要があるかどうか教えてくださいxmldocument ???
スミット2011年

3
私は.NETAPIにあまり精通していません。ただし、XMLResolverプロパティが何に設定されているかを確認する必要がある場合があります。XMLResolverプロパティがXMLDocumentオブジェクトに設定されていない場合、外部リソースをロードしない可能性があります。msdn.microsoft.com/en-us/library/5fcwybb2.aspx
Mads Hansen

1
Chromeのようなブラウザはこれを理解していますか?
アルプス

3
ブラウザは、ローカルファイルのセキュリティ上の理由からこれを無効にする場合があります。chromeの--allow-file-access-from-filesスイッチを使用するか、ホストにアップロードします
premek.v 2014

1
.NETで、XmlReaderSettingsでXmlResolver(デフォルトのXmlUriResolverを作成することにより)とProhibitDTD(falseに設定)を設定して、過去のアクセス許可の問題を取得します。デフォルトでは、Windows /.NETセキュリティポリシーは外部リソースのロードを許可していないようです。
ジョン・イエス

26

他の回答は、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>

1
これは、XincludeとXML外部エンティティの比較です。どちらも上位2つの回答であり、すでに使用例を示しているか、提供しています。私はそれが議論に追加され、コメントするには長すぎる/複雑すぎると感じました。同様に、質問は「どのように」ではなく「できる」を尋ねます。一般化された質問に答える限り、これは私が本当に質問の意図であると感じた方向性を明確にすることに向けられます。特定の実装に関する他の多くの優れたリファレンス。そうは言っても、フィードバックをありがとうございます。間もなく例を挙げて更新します。
VoteCoffee 2017年

例を追加して問題を解決しようとしたことに対するあなたの回答と敬意に感謝しますが、あなたの答えはまだ根本的に欠陥があると思います。一般に、他の場所からテキストを引用するときは、そのテキストをブロック引用に含める必要があり(盗用しようとしていないことが明らかになるように)、さらに重要なことに、引用した理由を非常に明確に説明するブロック引用の上/下に独自のディスカッションを提供します。その特定のテキストとそれが質問に答えるのにどのように役立つか。これらの両方を実行して再度コメントする場合(通知が届くように)、コメントを削除して反対票を撤回します。
Dan Bechard 2017年

ブロック引用符やコメントで更新
VoteCoffee

これは非常に良い答えです!私の最初のコメントに賛成して削除しましたが、これはもはや真実ではありません。私は文脈のために他のコメントを残し、うまくいけば将来の読者がより良い答えを書くのを助けるでしょう。
Dan Bechard 2017年

11

msdn.microsoft.com/en-us/library/aa302291.aspxを試してみまし たが、使用しませんでした:(私のXmlはmain.xml <?xml version = "1.0"?> <Head> <xi:include href = "imported.xml" xmlns:xi = " w3.org/2003/XInclude" > </ Head> Imported.xml <?xml version = "1.0"?> <footer>©ContosoCorp、2003 </ footer>および最終的に取得するxmlは次のとおりです。<?xml version = "1.0"?> <Head> <xi:include href = "imported.xml" xmlns:xi = " w3.org/2003/XInclude " /> </ Head>私は何か間違ったことをしていますか?
Sumit 2011

Javaでは、XIncludeのサポートを明示的に有効にする必要があります。たぶんあなたの図書館は同じ準備を必要としますか?
Tomasz Nurkiewicz 2011

私は.. ..私はマッズ・ソリューションでXMLをインポートすることができた、XMLを解析するために、あなたの時間に感謝を.NETを使用していた
スミット

1
libxmlはこれをサポートしています。
RishiD 2013年

1
Javaの場合、以下の行を追加する必要があります-DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); dbFactory.setXIncludeAware(true);
Rahul Sahu 2016年

1

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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.