18

私は XML を初めて使用するので、これはかなり簡単に答えられる質問かもしれません。他の XML ファイル内から外部 XML ファイルを参照する標準的な方法があるかどうか疑問に思っていました。例を挙げましょう。大量のデータを保持する単一のオブジェクトを定義するファイルがあるとします。

<person>
    <name>John</name>
    <age>18</age>
    <hair>Brown</hair>
    <eyes>Blue</eyes>
</person>

この質問のために、その人が他の情報をたくさん持っているとしましょう。ファイルが 10 MB 程度であると仮定します。

ここで、グループを定義する別の XML ファイルがあるとします。

<group>
    <person>
        <name>John</name>
        <age>18</age>
        <hair>Brown</hair>
        <eyes>Blue</eyes>
    </person>
    <person>
        <name>Kim</name>
        <age>21</age>
        <hair>Blue</hair>
        <eyes>Green</eyes>
    </person>
    <person>
        <name>Sean</name>
        <age>22</age>
        <hair>Black</hair>
        <eyes>Brown</eyes>
    </person>
</group>

ご覧のとおり、Personが非常に大きい場合、Groupファイルも非常に大きくなります。では、 John.xmlのようなものがある場合、John のすべてのデータを明示的に定義せずにGroup.xmlでそれを参照する標準的な方法はありますか? これは非常に幅広いトピックだと思いますので、関連する Web ページへのリンクを自由に付けてください。ありがとう!

4

5 に答える 5

12

基準

XIncludeは、あらゆるレベルのサポートを備えた唯一の標準です。

  • Oxygenxmlspyなど、いくつかの XML エディターがサポートしています。
  • Xercesを含むいくつかの XML パーサーもサポートしており、.net ポートもあります。
  • Saxonなどのいくつかの XML ツールは、Java と.netの両方でサポートしています。

XInclude に関するウィキペディアの記事には、いくつかの良い使用例があります。

XLinkは、実際にはドキュメントを含めるためではなく、他のドキュメント内の部分を引用するための接線関連の標準です。十分にサポートされていません。

代替案

サイズが気になる場合は、いくつかの方法があります。

  • クエリを解決するために必要な情報だけをメモリに保持するDataDirect XQuery (または程度は低いですが、Saxon 9.3 EEなど)のストリーミング XML プロセッサを使用します。
  • MarkLogiceXistなどのXML データベースを使用します。
  • 1 つの XML ファイルを使用して、他の XML ファイルの名前をリストします。XQuery または XSLT で記述されたプログラムは、doc()関数を使用して読み取り、処理します。( DDXQSaxonのように、プロセッサがストリーミングしているか、終了したドキュメントを破棄する方法がない限り、同じサイズの問題が発生します。)
于 2009-07-01T05:55:24.687 に答える
5

XLink と XInclude (目的に応じて)という「標準的な」方法がいくつかありますが、外部参照を取り込むことができるプロセッサがあることを確認する必要があります。ほとんどの XML ライブラリには、この機能が既に有効になっているわけではありません。

次に、次のようなことができます:

<group>
  <personlink xlink:href="person.xml" xlink:show="embed" xmlns:xlink="http://www.w3.org/1999/xlink"/>
</group>

ただし、おそらくこれは本当に必要ありません。大きな文書から情報のサブセットが必要な場合は、XSLT または XQuery を使用して必要な部分を簡単に切り取ることができます。このアプローチを SAX 解析 (イベント ベースであり、ドキュメント全体がメモリ内にない) と共に使用して、かなり大きなドキュメントを処理するようにアプリケーションをスケーリングできます。

DOM を使用している間でさえ、数十メガバイトの範囲になるまでは、大きなドキュメントに問題があることに気づきませんでした。

于 2009-06-30T18:29:48.430 に答える
3

エンティティ参照を宣言できる DTD の XML 仕様を次に示します。

次のような単純なドキュメント:

<!DOCTYPE test [
    <!ENTITY ref SYSTEM "file:///C:/test.txt" >
]>

<test>
    &ref;
</test>

そして file:///C:/test.txt は次のとおりです。

<blah>
Fee
Fi
Fo
Fum
</blah>

元のドキュメントを次のように展開します。

<test>
    <blah>
    Fee
    Fi
    Fo
    Fum
    </blah>
</test>

検証を行わない XML パーサーは参照を展開する必要はないと私は信じているので、注意が必要です。

また、XMLDecl に standalone="no" を入れることを忘れないでください。(standalone 属性がない場合は、「いいえ」と見なされますが、そこに配置する方が良いです...)

于 2009-06-30T18:38:23.783 に答える
0

ええと、xmlファイルにサイズ制限はありません。極端に大きなサイズについて心配する必要はありません。でも覚えておいて; Xmlはデータ交換形式であり、データベース形式ではありません。xmlを使用して、異なるアプリケーション/サービス間でデータを交換します。

于 2009-06-30T17:51:25.793 に答える
0

そのようなノードをインポートするための標準はありません(すべてのパーサーで機能します)。ただし、要素の一部を属性に変更することでスペースを節約できます

<group>
  <person name='John' age='18' hair='Brown' eyes='Blue' />
  <person name='Kim' age='21' hair='Blue' eyes='Green' />
  <person name='Sean' age='22' hair='Black' eyes='Brown' />
</group>
于 2009-06-30T17:53:52.640 に答える