8

編集:私の(不完全で非常にラフな)XmlLiteヘッダーの翻訳はGitHubで利用できます

DOMを使用せずにDelphiの大規模なXMLドキュメントとMSXMLを単純に組み合わせる最良の方法は何ですか?COMコンポーネントのSAXReaderとXMLWriterを使用する必要がありますか?良い例はありますか?

変換は、ルート(コンテナー)から多くの大きなファイル(60MB以上)から1つの大きなファイル(約1GB)までのすべてのContents要素の単純な組み合わせです。

<Container>
    <Contents />
    <Contents />
    <Contents />
</Container>

XmlWriterとXmlReadersを使用して次のC#コードで動作させていますが、ネイティブのDelphiプロセスで実行する必要があります。

var files = new string[] { @"c:\bigFile1.xml", @"c:\bigFile2.xml", @"c:\bigFile3.xml", @"c:\bigFile4.xml", @"c:\bigFile5.xml", @"c:\bigFile6.xml" };

using (var writer = XmlWriter.Create(@"c:\HugeOutput.xml", new XmlWriterSettings{ Indent = true }))
{
    writer.WriteStartElement("Container");

    foreach (var inputFile in files)
        using (var reader = XmlReader.Create(inputFile))
        {
            reader.MoveToContent();
            while (reader.Read())
                if (reader.IsStartElement("Contents"))
                    writer.WriteNode(reader, true);
        }

    writer.WriteEndElement(); //End the Container element
}

システムの他の部分ではすでにMSXMLDOMを使用しており、可能であれば新しいコンポーネントを追加したくありません。

4

4 に答える 4

3

XmlLiteは、System.XmlのxmlリーダーおよびライターのネイティブC ++ポートであり、プル解析プログラミングモデルを提供します。これは、W2K3 SP2、WinXPSP3以降に同梱されています。C#からDelphiにほぼ1-1マッピングする前に、Delphiヘッダーの変換が必要になります。

于 2011-08-07T00:41:58.973 に答える
1

通常のファイルI/Oを使用して、テキストファイルにaを書き込み、各コンテンツを文字列として書き込み、最後にwritelnを実行します。より妥当なサイズの場合は、すべてを文字列リストにまとめてから、ディスクにストリーミングします。しかし、GBの領域に興味がある場合は、それは危険です。

于 2011-08-04T14:23:18.120 に答える
1

DelphiラッパーLibxml2を使用したlibxmlオプションである可能性があり(ここにあります)、SAXをサポートしており、非常に堅実なようです。Webページには、libxml2がOASIS XMLTestsSuiteの1800以上のテストすべてに合格したと記載されています。参照:DelphiおよびFree Pascal用のSAXパーサーはありますか?

于 2011-08-04T14:57:48.877 に答える
0

スペースとフォーマットが必要なため、これを回答として投稿します。

テスト用のbaaadデータファイルが1つあります 。https://github.com/the-Arioch/omnixml/commit/d1a544048e86921983fced67c772944f12cb1427のメッセージを参照してください。

ここで、OmniXMLはXE2デバッグビルドの一種です。

  • TXmlDocument / MSXMLよりも約25%多くのメモリ使用量。.NextSiblingの問題を修正した後、おそらくさらに多く、再テストしませんでした。
  • より長いファイル読み込み時間(OTOHはノードプロパティの読み取りを大幅に高速化します:それらはすでにDelphi型変数であり、MSXML / Delphi境界を越えることはありません)
  • 名前空間はまったくサポートされていないため、タグの認識が非常に難しくなります
  • 名前空間の欠如を含む、胚状態のXPath

https://docs.google.com/spreadsheets/d/1QcFVwh3fFfaDyRmv2b-n4Rq4_u5p42UfNbR_FZgZizY/edit?usp=sharing

于 2016-10-04T12:16:40.060 に答える