SaxとDomの違いは、Xmlの解析に関してはかなり重要ですが、作成するのはどうでしょうか。Saxを使用して新しいXmlを作成する方法もありますか、またはプログラムのデータに基づいて新しいXmlファイルを作成する場合は、DOMを使用する必要がありますか?
ありがとう
SAXは、ウィキペディアを引用しています:
SAX (Simple API for XML)は、XML用のシリアルアクセスパーサーAPIです。
SAXは、XMLドキュメントからデータを読み取るためのメカニズムを提供します。
つまり、SAXはXMLドキュメントの読み取りに最適ですが、XMLドキュメントを作成する場合は、おそらくDOMを使用することになります。
SAXを使用してXMLを作成できます。以下を参照してください。
http://code.google.com/p/jlibs/wiki/XMLDocument
Javaです。ただし、C++でも同じことができます。
また、SAXパーサーとDOMパーサーの違いに興味があるかもしれません
DOMとSAXが試されました
SAXは、XMLドキュメントを書き込むためのものではなく、読み取るためのものです。
反対側のDOMは、メモリ内の構造とXMLドキュメント間のマッピングを作成することを目的としています。
メモリ内のデータ用に独自のデータ構造がすでにある場合(これは、処理用のDOM構造よりもはるかに便利です)、DOMデータ構造を作成すると、データを複製することになります。大きなデータがある場合、それはあなたが望むものではないかもしれません。さらに、DOM構造をXMLに書き込む前に完全に作成する必要があり、アプリケーションに必要なメモリサイズが2倍になります。さらに、処理にレイテンシが発生します。
XMLドキュメントの作成に役立つライブラリについてはわかりませんが、独自のデータ構造を持つSAXをすでに使用している場合は、DOMを気にする必要はありません。
DOMは、ドキュメントを作成するための自然な選択です。
SAXスタイルのライティングAPIは見たことがありません。読み取り専用です。オプションを作成するためのオプションは、DOMとさまざまな非標準化ビルダーAPI(DOMよりもはるかに便利な場合が多い)です。標準化されていないAPIは言語/ライブラリごとに異なりますが、たとえばBuilderforRubyを参照してください。また、演算子のオーバーロードを使用してC ++用の同様のAPIを作成しました:(例は可能なAPIをテストしているだけで、実際には何もしません)
#include <string>
struct XMLBuilder {
XMLBuilder& operator[](std::string const& elemName) { return *this; }
XMLBuilder& operator()(std::string const& attrName, std::string const& attrValue) { return *this; }
XMLBuilder& operator()(std::string const& innerText) { return *this; }
XMLBuilder& operator()(XMLBuilder const& innerDoc) { return *this; }
};
int main() {
XMLBuilder()
["contact"](XMLBuilder()
["name"]("Patrick Hines")
["phone"]("type", "home")("206-555-0144")
["phone"]("type", "work")("425-555-0145")
["address"](XMLBuilder()
["street"]("...")
["zip"]("12345")
)
)
;
}
printfを使用して単純なXMLを作成することもありますが、通常は、CodeSynthesisXSDなどのXMLバインディングツールを使用する価値があります。これにより、XSDに基づいてクラス階層が作成されます。オブジェクト階層にデータを入力するだけで、XMLが作成されます。
このようにして、XMLが適切に形成され、有効であるかどうかの静的チェックを取得します。これは、バグを早期に発見するのに役立ちます。
JAXBまたはJava用の同様のツールを使用したことがある場合、それはほとんど同じことです。
新しいXMLの作成には常にDOMを使用してください...読む目的ではSAXをお勧めします。
あなたの言語/プラットフォームで.NETのXmlWriterに相当するものを見つけてみることができます。