XML を操作するにはライブラリを使用することが必須ですか?

StackOverflow https://stackoverflow.com/questions/24866

  •  09-06-2019
  •  | 
  •  

質問

ブラウザに渡される 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つの点に留意する必要があります。

  1. あなたのコードはライブラリほど成熟していません。ポップアップするバグを処理する時間を計画に割り当てます。
  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 を解析/生成するための独自のコードを書き始める前に。

いいえ-特に生成用(入力テキストは常にあなたを驚かせる可能性があるので、私は構文解析をあまり好みません)。私はそれでいいと思います-しかし、あなたが自分自身のコードを維持するのに数分以上費やしていることに気付いたら、ライブラリに移行する準備をしてください。

J文字列

最初のページで、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;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top