質問
ブラウザに渡される XML 文字列を作成するために Java バックエンドを使用しています。現在、単純な文字列操作を使用してこの XML を作成しています。XML 文字列を生成するには Java の XML ライブラリを使用する必要がありますか?私が必要としているライブラリに比べて、ライブラリを使用するのが非常に難しいと感じています。
解決
必須ではありませんが、お勧めします。ただし、文字列操作が機能する場合は、それを選択してください!小さな、または単純なXMLテキストを手作業で安全に作成できるケースはたくさんあります。
XMLテキストの作成は見た目よりも難しいことに注意してください。私が検討する基準は次のとおりです。
- 最初:XMLに入力される情報について、どのくらいコントロールしますか?
ソースデータに対する制御が少ないほど、トラブルが発生する可能性が高くなり、ライブラリが有利になります。例:(a)要素名には名前に違法な文字が含まれないことを保証できますか? (b)属性のコンテンツの引用はどうですか?それらは発生する可能性があり、それらを処理していますか? (c)データにエンティティとしてエンコードする必要のあるものが含まれていますか& lt; として出力する必要がある場合が多い-正しくやっていますか?
- 第二に、保守性:XMLを構築するコードは、他の誰かが理解しやすいか
おそらく、一生コードにこだわる必要はないでしょう。私は、XMLを手動で作成する中古のC ++コードを使用しましたが、驚くほどあいまいです。もちろん、これがあなたの個人的なプロジェクトである場合、「その他」を心配する必要はありません。 「その他」の場合上記。
パフォーマンスについては心配しません。 XMLが単純で手書きできるほど単純な場合、ライブラリからのオーバーヘッドはおそらく無意味です。もちろん、あなたのケースは異なるかもしれませんが、最初にそれを証明するために測定する必要があります。
最後に、はい。 XMLテキストが十分に単純な場合は、手でXMLテキストを作成できます。利用可能なライブラリがわからないことは、おそらくおそらく正しい理由ではありません。
最新のXMLライブラリは非常に強力なツールですが、手ごわいこともあります。ただし、XMLライブラリの本質を学ぶことはそれほど難しくなく、非常に便利です。とりわけ、今日の仕事の市場ではほとんど必要条件です。必要なものが得られるまで、名前空間、スキーマ、その他のより洗練された機能に縛られないでください。
がんばって。
他のヒント
Xmlは難しいです。自分で構文解析することは悪い考えです。自分でコンテンツを生成することはさらに悪い考えです。 Xml 1.1仕様をご覧ください。
適切なエンコーディング、属性エンコーディング(無効なxmlの生成など)、適切なCDATAエスケープ、UTFエンコーディング、カスタムDTDエンティティなどを処理する必要があり、それはデフォルト/空のネームスペースを持つxmlネームスペースを混在させない、名前空間の属性など
ツールキットを学びましょう。たくさんあります。
カスタム文字列の操作は問題ないと思いますが、次の2つの点に留意する必要があります。
- あなたのコードはライブラリほど成熟していません。ポップアップするバグを処理する時間を計画に割り当てます。
- xmlが成長し始めたとき、おそらくあなたのアプローチはサードパーティのライブラリほどスケーリングしません(パフォーマンスと使いやすさの両方の点で)。
XML出力(および入力用のサードパーティライブラリ)にカスタム文字列操作を使用するコードベースを知っています。そもそも問題ありませんでしたが、しばらくすると本当に面倒になりました。
はい、ライブラリを使用します。
だれかが時間と労力をかけて、思いついたものよりも通常良いものを作成しました。文字列操作は単一のノードを送り返すためのものですが、DOMを操作したり、XPathクエリを使用したりしなければならない場合、ライブラリはあなたを救います。
ライブラリを使用しないことにより、整形式でないデータを生成または解析するリスクがあります。これは遅かれ早かれ 起こります。 XHTMLで document.write
が許可されないのと同じ理由で、XMLマークアップを文字列として記述しないでください。
はい。
重要なツールをスキップしても意味がありません。名前空間のバインドはもちろん、必要に応じてこれらのアンパサンドとltをエスケープする必要があるため、xmlを記述することも簡単です。 そして最終的に、libsは一般にxmlの読み取りと書き込みをより確実に行うだけでなく、より効率的に行うことができます(特にJavaの場合)。
ただし、複雑すぎると思われる場合は、間違ったツールを見ている可能性があります。 JAXBまたはXStreamを使用したデータバインディングは簡単です。しかし、単純で単純なXML出力の場合は、 StaxMate を使用します。実際には多くの方法でタスクを簡素化できます(開始タグを自動的に閉じ、必要に応じて名前空間宣言を書き込みます)。
いいえ-(実行中に)自分で解析でき、ニーズに合わせて拡張できる場合、ライブラリは必要ありません。
将来のニーズが満たされることを確認してください-複雑なxmlの作成は、ライブラリを使用することでより適切に行われます-いくつかは非常にシンプルなフレーバーでも提供されます。
本番コードでこのようなことをしたのは、同僚とプリプロセッサを構築して、他のファイルのXMLフラグメントをより大きなXMLに埋め込むことができたときだけでした。ロード時には、最初にこれらの埋め込み(XMLコメント文字列のファイル参照)を解析し、参照した実際のフラグメントに置き換えます。次に、結合した結果をXMLパーサーに渡します。
XMLを解析するためにライブラリを使用する必要はありませんが、この質問を確認してください
車輪の再発明を行う前に、どのようなことを考慮する必要がありますか?
XML を解析/生成するための独自のコードを書き始める前に。
いいえ-特に生成用(入力テキストは常にあなたを驚かせる可能性があるので、私は構文解析をあまり好みません)。私はそれでいいと思います-しかし、あなたが自分自身のコードを維持するのに数分以上費やしていることに気付いたら、ライブラリに移行する準備をしてください。
最初のページで、Googleがスペインから見つけます(スペイン語の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;
}