11

ブラウザに渡されるXML文字列を作成するためにJavaバックエンドを使用しています。現在、私はこのXMLを生成するために単純な文字列操作を使用しています。XML文字列を生成するためにJavaでXMLライブラリを使用することが不可欠ですか?ライブラリは、必要なものに比べて非常に使いにくいと思います。

4

11 に答える 11

12

必須ではありませんが、お勧めします。ただし、文字列操作が機能する場合は、それを実行してください。小さいまたは単純なXMLテキストを手作業で安全に作成できる場合はたくさんあります。

XMLテキストの作成は見た目より難しいことに注意してください。これが私が考慮するいくつかの基準です:

  • まず、xmlに入る情報をどの程度制御できますか?

ソースデータの制御が少ないほど、問題が発生する可能性が高くなり、ライブラリがより有利になります。例:(a)要素名に名前に違法な文字が含まれないことを保証できますか?(b)属性のコンテンツの引用はどうですか?それらは起こり得ますか、そしてあなたはそれらを扱っていますか?(c)データには、エンティティとしてエンコードする必要がある可能性のあるものが含まれていますか(たとえば、<として出力する必要があるより少ないものなど)。正しくやっていますか?

  • 第二に、保守性:XMLを構築するコードは他の誰かが理解しやすいですか?

あなたはおそらく一生コードに固執したくないでしょう。私はXMLを手作業で作成する中古のC++コードを使用してきましたが、驚くほどわかりにくい場合があります。もちろん、これがあなたの個人的なプロジェクトである場合は、「その他」について心配する必要はありません。上記の「その他」を「1年以内」に置き換えてください。

パフォーマンスは気になりません。XMLが手で書くことができるほど単純である場合、ライブラリからのオーバーヘッドはおそらく無意味です。もちろん、あなたのケースは異なるかもしれませんが、最初にそれを証明するために測定する必要があります。

最後に、はい。十分に単純な場合は、XMLテキストを手動で作成できます。しかし、利用可能なライブラリを知らないことは、おそらく正しい理由ではありません。

最新のXMLライブラリは非常に強力なツールですが、気が遠くなることもあります。ただし、XMLライブラリの基本を学ぶことはそれほど難しくなく、非常に便利です。とりわけ、それは今日の求人市場ではほとんど必要条件です。必需品を手に入れるまでは、名前空間、スキーマ、その他のより洗練された機能にとらわれないでください。

幸運を。

于 2008-08-24T07:17:49.817 に答える
7

Xmlは難しいです。自分自身を解析することは悪い考えです。自分でコンテンツを生成することはさらに悪い考えです。Xml1.1の仕様をご覧ください。

適切なエンコーディング、属性エンコーディング(たとえば、無効なxmlを生成する)、適切なCDATAエスケープ、UTFエンコーディング、カスタムDTDエンティティなどを処理する必要があります。これにより、デフォルト/空の名前空間、名前空間属性との混合xml名前空間をスローする必要がなくなります。 、など。

ツールキットを学びましょう。たくさんあります。

于 2008-08-24T10:07:37.663 に答える
3

カスタム文字列操作は問題ないと思いますが、次の2つの点に注意する必要があります。

  1. あなたのコードはライブラリほど成熟していません。ポップアップするバグを処理するために、計画に時間を割り当てます。
  2. xmlが大きくなり始めたとき(パフォーマンスと使いやすさの両方の点で)、あなたのアプローチはおそらくサードパーティのライブラリほど拡張されません。

xml出力(および入力用のサードパーティライブラリ)にカスタム文字列操作を使用するコードベースを知っています。最初は大丈夫でしたが、しばらくすると本当に面倒になりました。

于 2008-08-24T05:54:22.263 に答える
2

はい、ライブラリを使用してください。

誰かが時間と労力を費やして、通常はあなたが思いつくものよりも優れたものを作成しました。文字列操作は単一のノードを送り返すためのものですが、DOMを操作する必要がある場合、またはXPathクエリを使用する必要がある場合は、ライブラリによって保存されます。

于 2008-08-24T05:56:11.637 に答える
2

ライブラリを使用しないと、整形式ではないデータを生成または解析するリスクがあり、遅かれ早かれそうなります。XHTML で許可されていないのと同じ理由document.writeで、XML マークアップを文字列として記述しないでください。

于 2008-08-24T16:59:50.450 に答える
2

はい。

不可欠なツールをスキップするのは意味がありません: xml を記述することでさえ、これらのアンパサンドと lt をエスケープする必要があり、名前空間バインディング (必要な場合) は言うまでもなく、簡単ではありません。そして最終的に、libs は一般に xml をより確実に、より効率的に読み書きできます (特に Java の場合)。

しかし、ツールが複雑すぎると思われる場合は、間違ったツールを見ている可能性があります。JAXB または XStream を使用したデータ バインディングは単純です。しかし、シンプルでわかりやすい XML 出力の場合は、StaxMateを使用します。実際には多くの方法でタスクを簡素化できます (開始タグを自動的に閉じる、必要に応じて名前空間宣言を書き込むなど)。

于 2009-04-09T06:27:57.503 に答える
1

いいえ-(実行しているように)自分で解析でき、ニーズに合わせてスケーリングできる場合は、ライブラリは必要ありません。

将来のニーズが満たされることを確認してください。複雑なxmlの作成は、ライブラリを使用して行う方が適切です。ライブラリの中には、非常に単純なフレーバーのものもあります。

于 2008-08-24T05:50:46.703 に答える
1

XML を解析するためにライブラリを使用する必要はありませんが、この質問を確認してください

xml を解析/生成するための独自のコードを書き始める前に。

于 2008-08-24T17:05:22.260 に答える
1

実動コードでこのようなことを行ったのは、他のファイルからの XML フラグメントをより大きな XML に埋め込むことができるように、同僚と一緒にプリプロセッサーを作成したときだけでした。読み込み時には、まずこれらの埋め込み (XML コメント文字列内のファイル参照) を解析し、それらが参照した実際のフラグメントに置き換えます。次に、結合した結果を XML パーサーに渡します。

于 2008-08-26T10:25:43.110 に答える
0

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

于 2008-08-24T07:00:29.797 に答える
0

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;
}
于 2008-08-24T07:03:28.510 に答える