2010-11-22 9 views
1

私はXMLを解析するコードを書いています。xml解析では、要素や属性の方が速いですか?

解析するのが速いのは、要素または属性です。

これは私のXMLデザインに直接的な影響を与えます。

C#の回答とLINQとXmlReaderの違いをターゲットにしてください。

ありがとうございました。

+11

実際に問題が発生しない限り、XML形式を設計する際の主な目標はパフォーマンスであってはなりません。 –

+4

本当にスピードが必要な場合は、XMLを使用しないでください。解析するのがはるかに簡単なJSONのようなものを使用するか、何らかの形式のバイナリシリアル化を使用します。 – cdhowie

+0

より良い質問は、情報の表現としてどちらが意味があるのでしょうか? – jball

答えて

3

XMLの場合、速度は多くの要因に依存します。

属性または要素に関しては、データに一番近いものを選択します。ガイドラインとして、オブジェクトの属性には属性を使用します。含まれるサブオブジェクトの要素。

属性を使用するデータの量によっては、XMLストリームのサイズを少しでも節約できます。たとえば、<person id="123" /><person><id>123</id></person>より小さい。これは構文解析にはあまり影響しませんが、ネットワークワイヤを介してデータを送信したりディスクから読み込んだりする速度に影響します。あなたのアプリケーションに影響を与えます。

もちろん、それが実際に違いを生むのであれば、JSONやいくつかのバイナリ表現を使用する方がいいでしょう。

最初に質問する必要があるのは、XMLが必要なのかどうかということです。人間が読める必要がない場合は、おそらくバイナリが良いでしょう。ヘック、CSV、さらには固定幅のファイルでも良いでしょう。

LINQ vs XmlReaderに関しては、これは解析中のデータの処理に沸きます。あなたは、オブジェクトの束をインスタンス化し、そのように処理する必要がありますか、それとも入って来るようにストリームを読む必要がありますか?データの基本的な文字列操作を行うのが最も簡単で最善の方法かもしれません。

ポイントは、「もっと速く解析する」以外の各アプローチの強みを検討する必要があるかもしれません。

4

情報の表現が実際に意味をなされるように、XMLスキーマを設計します。通常、属性または要素の中に何かを作るという決定は、パフォーマンスに影響を与えません。

XMLのパフォーマンスの問題は、ほとんどの場合、非常に冗長なXMLダイアレクトで表現される大量のデータに関連しています。典型的な対策は、ワイヤを介してXMLデータを格納または送信するときにXMLデータを圧縮することです。

これで十分でない場合は、JSON、ASN.1、カスタムバイナリ形式などの別の形式に切り替えることができます。一方、XDocument(LINQ)との主な違いをしてXmlReaderクラスがXDocumentクラスは高価な操作であるかもしれないメモリ内の完全なドキュメントオブジェクトモデル(DOM)を、構築することです:

あなたの質問の後半部分に対処XmlReaderクラスは入力ドキュメントにトークン化されたストリームを与えます。

+0

-1。情報がスキーマを持っている限り(たとえそれがあなたの頭の中にあって明示的でなくても)、それはバイナリ形式であっても意味があります(固定バイトサイズのレコードなど)。どのように格納されているのかは問題ではありませんが、パーサが格納する方法は何ですか。あなたの答えは、質問が「より速く、属性または要素が何であるか」から「真実を気にする人」にシフトする赤い鳴き声です。XMLのためにパフォーマンスの問題がある場合、パフォーマンスの問題を引き起こしてはならないのでスキーマを再設計する必要があります"問題は真実であり、ここで十分ではありません。 – Dmitry

1

私は、MicrosoftのWCFチームがWCFの標準であるDataContractSerializerを使用することを選択したことを実証しています。 XML属性をサポートしていないという点で制限がありますが、実際にはXmlSerializerよりも10-15%高速です。

この情報から、XML属性を使用すると、XML要素のみを使用する場合より解析が遅くなると思います。

関連する問題