ブラウザに渡されるXML文字列を作成するためにJavaバックエンドを使用しています。現在、私はこのXMLを生成するために単純な文字列操作を使用しています。XML文字列を生成するためにJavaでXMLライブラリを使用することが不可欠ですか?ライブラリは、必要なものに比べて非常に使いにくいと思います。
11 に答える
必須ではありませんが、お勧めします。ただし、文字列操作が機能する場合は、それを実行してください。小さいまたは単純なXMLテキストを手作業で安全に作成できる場合はたくさんあります。
XMLテキストの作成は見た目より難しいことに注意してください。これが私が考慮するいくつかの基準です:
- まず、xmlに入る情報をどの程度制御できますか?
ソースデータの制御が少ないほど、問題が発生する可能性が高くなり、ライブラリがより有利になります。例:(a)要素名に名前に違法な文字が含まれないことを保証できますか?(b)属性のコンテンツの引用はどうですか?それらは起こり得ますか、そしてあなたはそれらを扱っていますか?(c)データには、エンティティとしてエンコードする必要がある可能性のあるものが含まれていますか(たとえば、<として出力する必要があるより少ないものなど)。正しくやっていますか?
- 第二に、保守性:XMLを構築するコードは他の誰かが理解しやすいですか?
あなたはおそらく一生コードに固執したくないでしょう。私はXMLを手作業で作成する中古のC++コードを使用してきましたが、驚くほどわかりにくい場合があります。もちろん、これがあなたの個人的なプロジェクトである場合は、「その他」について心配する必要はありません。上記の「その他」を「1年以内」に置き換えてください。
パフォーマンスは気になりません。XMLが手で書くことができるほど単純である場合、ライブラリからのオーバーヘッドはおそらく無意味です。もちろん、あなたのケースは異なるかもしれませんが、最初にそれを証明するために測定する必要があります。
最後に、はい。十分に単純な場合は、XMLテキストを手動で作成できます。しかし、利用可能なライブラリを知らないことは、おそらく正しい理由ではありません。
最新のXMLライブラリは非常に強力なツールですが、気が遠くなることもあります。ただし、XMLライブラリの基本を学ぶことはそれほど難しくなく、非常に便利です。とりわけ、それは今日の求人市場ではほとんど必要条件です。必需品を手に入れるまでは、名前空間、スキーマ、その他のより洗練された機能にとらわれないでください。
幸運を。
Xmlは難しいです。自分自身を解析することは悪い考えです。自分でコンテンツを生成することはさらに悪い考えです。Xml1.1の仕様をご覧ください。
適切なエンコーディング、属性エンコーディング(たとえば、無効なxmlを生成する)、適切なCDATAエスケープ、UTFエンコーディング、カスタムDTDエンティティなどを処理する必要があります。これにより、デフォルト/空の名前空間、名前空間属性との混合xml名前空間をスローする必要がなくなります。 、など。
ツールキットを学びましょう。たくさんあります。
カスタム文字列操作は問題ないと思いますが、次の2つの点に注意する必要があります。
- あなたのコードはライブラリほど成熟していません。ポップアップするバグを処理するために、計画に時間を割り当てます。
- xmlが大きくなり始めたとき(パフォーマンスと使いやすさの両方の点で)、あなたのアプローチはおそらくサードパーティのライブラリほど拡張されません。
xml出力(および入力用のサードパーティライブラリ)にカスタム文字列操作を使用するコードベースを知っています。最初は大丈夫でしたが、しばらくすると本当に面倒になりました。
はい、ライブラリを使用してください。
誰かが時間と労力を費やして、通常はあなたが思いつくものよりも優れたものを作成しました。文字列操作は単一のノードを送り返すためのものですが、DOMを操作する必要がある場合、またはXPathクエリを使用する必要がある場合は、ライブラリによって保存されます。
ライブラリを使用しないと、整形式ではないデータを生成または解析するリスクがあり、遅かれ早かれそうなります。XHTML で許可されていないのと同じ理由document.write
で、XML マークアップを文字列として記述しないでください。
はい。
不可欠なツールをスキップするのは意味がありません: xml を記述することでさえ、これらのアンパサンドと lt をエスケープする必要があり、名前空間バインディング (必要な場合) は言うまでもなく、簡単ではありません。そして最終的に、libs は一般に xml をより確実に、より効率的に読み書きできます (特に Java の場合)。
しかし、ツールが複雑すぎると思われる場合は、間違ったツールを見ている可能性があります。JAXB または XStream を使用したデータ バインディングは単純です。しかし、シンプルでわかりやすい XML 出力の場合は、StaxMateを使用します。実際には多くの方法でタスクを簡素化できます (開始タグを自動的に閉じる、必要に応じて名前空間宣言を書き込むなど)。
いいえ-(実行しているように)自分で解析でき、ニーズに合わせてスケーリングできる場合は、ライブラリは必要ありません。
将来のニーズが満たされることを確認してください。複雑なxmlの作成は、ライブラリを使用して行う方が適切です。ライブラリの中には、非常に単純なフレーバーのものもあります。
XML を解析するためにライブラリを使用する必要はありませんが、この質問を確認してください
。
xml を解析/生成するための独自のコードを書き始める前に。
実動コードでこのようなことを行ったのは、他のファイルからの XML フラグメントをより大きな XML に埋め込むことができるように、同僚と一緒にプリプロセッサーを作成したときだけでした。読み込み時には、まずこれらの埋め込み (XML コメント文字列内のファイル参照) を解析し、それらが参照した実際のフラグメントに置き換えます。次に、結合した結果を XML パーサーに渡します。
いいえ-特に生成の場合(入力テキストは常にあなたを驚かせる可能性があるため、構文解析はあまり気になりません)。私はそれでいいと思いますが、自分のコードを維持するのに数分以上費やしていることに気付いた場合は、ライブラリに移行する準備をしてください。
JDKに付属しているDOMXMLAPIを使用するのは難しいとは思いません。要素ノード、属性などを簡単に作成できます。後で、文字列をDOMドキュメントに変換したり、DOMドキュメントを文字列に変換したりするのも簡単です。
最初のページで、グーグルはスペインから見つけました(スペイン語のXMLの例):
public String DOM2String(Document doc)
{
TransformerFactory transformerFactory =TransformerFactory.newInstance();
Transformer transformer = null;
try{
transformer = transformerFactory.newTransformer();
}catch (javax.xml.transform.TransformerConfigurationException error){
coderror=123;
msgerror=error.getMessage();
return null;
}
Source source = new DOMSource(doc);
StringWriter writer = new StringWriter();
Result result = new StreamResult(writer);
try{
transformer.transform(source,result);
}catch (javax.xml.transform.TransformerException error){
coderror=123;
msgerror=error.getMessage();
return null;
}
String s = writer.toString();
return s;
}
public Document string2DOM(String s)
{
Document tmpX=null;
DocumentBuilder builder = null;
try{
builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
}catch(javax.xml.parsers.ParserConfigurationException error){
coderror=10;
msgerror="Error crando factory String2DOM "+error.getMessage();
return null;
}
try{
tmpX=builder.parse(new ByteArrayInputStream(s.getBytes()));
}catch(org.xml.sax.SAXException error){
coderror=10;
msgerror="Error parseo SAX String2DOM "+error.getMessage();
return null;
}catch(IOException error){
coderror=10;
msgerror="Error generando Bytes String2DOM "+error.getMessage();
return null;
}
return tmpX;
}