複雑な XML からコンテンツを抽出するための正しいアプローチを見つけようとしています。キーワードを使用して、Xpath を使用して識別および抽出しようとしています。PDF ドキュメントから生成された XML から 50 以上の属性を抽出する必要があります。(XML として保存されます) さて、これが正しい方法かどうか疑問に思っています。
おそらくDOMパーサーを使用してXMLを解析し、必要なものを抽出する必要がありますか? 何かご意見は?
複雑な XML からコンテンツを抽出するための正しいアプローチを見つけようとしています。キーワードを使用して、Xpath を使用して識別および抽出しようとしています。PDF ドキュメントから生成された XML から 50 以上の属性を抽出する必要があります。(XML として保存されます) さて、これが正しい方法かどうか疑問に思っています。
おそらくDOMパーサーを使用してXMLを解析し、必要なものを抽出する必要がありますか? 何かご意見は?
「そう」どのように?誰にとって「正しい」?コーダーとして?パフォーマンスとして?あなたはどの「権利」を求めていますか?
ほとんどの場合、XPath が最もエレガントです。
thing = getPathThing(doc, "/path/to/element");
<repeat 50 times>
おそらく最も遅いでしょう。それは単に最も多くの仕事をしなければなりません。
DOM 手法は、潜在的に、わずかに高速になります。どちらも DOM をたどって要素を見つけます。すべての XPath 式がプリコンパイルされている場合ではなく、違いが顕著であるかどうかはわかりません。どちらもドキュメント全体がメモリにある必要があります。
最速の方法は、ストリーミング パーサー (SAX など) を実行することです。ただし、SAX パーサーは見た目が悪い傾向があります。他のメカニズムがあるのには理由があります。SAX は特にエレガントではありません。しかし、それは高速で、メモリが安価です。そのメモリ コストは、XML ペイロードの合計データではなく、保持するデータに関連しています。
「余裕がある」場合は、コードの保守性の POV から考えると、XPath がおそらく最善の策です。
まず、DOM を使用しないでください。あなたが Java の世界にいると仮定すると (実際にはそうは言いません)、XOM や JDOM2 などの最新のツリー モデルのいずれかを使用してください。特に名前空間を使用する場合は、作業がはるかに簡単で、高速で、必要なすべての機能をサポートしています。人々が DOM を使用するのは、これより優れたものがあることに気付いていないからです。
次に、ツリー モデルの使用と XPath の使用は相互に排他的ではありません。ツリーを構築してから、XPath ナビゲーションと直接ナビゲーションを組み合わせて行うことがよくあります。たとえば、XPath を使用して要素を検索し、直接ナビゲーションを使用してその属性にアクセスします。XPath を使用すると、より複雑なアクセス パスをより簡単に表現できるようになり、結果のコードはより保守しやすくなりますが、要素からその属性の 1 つにアクセスするためだけに XPath を使用することはありません。
どのアプローチ (DOM、SAX、XPath、データ バインディング) を使用しても、XML から Java にデータを取得するのは面倒です。アプリケーション全体を XSLT や XQuery などの XML ベースの言語で作成することにより、それを回避できる場合は、そうしてください。