Java 1.4 および SAX を使用して任意のデータを XML にエンコードするにはどうすればよいですか?

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

  •  09-06-2019
  •  | 
  •  

質問

XML の解析には SAX を使用します。これは、単一の値を解析するために XML ドキュメント全体をメモリに読み込む必要がないためです。SAX は XML の解析/デコードにのみ使用でき、XML の作成には使用できないと主張する記事を多く読みました。これは本当ですか?

役に立ちましたか?

解決

いいえ、そうではありません。次のようなものを使用して、Java の任意の Writer に XML をエンコードできます。

char[] ch;
AttributesImpl atts = new AttributesImpl();
Writer writer = new StringWriter();
StreamResult streamResult = new StreamResult(writer);
SAXTransformerFactory tf = (SAXTransformerFactory) TransformerFactory.newInstance();

// SAX2.0 ContentHandler
TransformerHandler transformerHandler = tf.newTransformerHandler();

Transformer serializer = transformerHandler.getTransformer();

serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
// serializer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "nodes.dtd");
serializer.setOutputProperty(OutputKeys.INDENT, "yes");

transformerHandler.setResult(streamResult);

transformerHandler.startDocument();

atts.clear();
// atts.addAttribute("", "", "xmlns", "CDATA", "http://www.example.com/nodes");
// atts.addAttribute("", "", "xmlns:xsi", "CDATA", "http://www.w3.org/2001/XMLSchema-instance");
// atts.addAttribute("", "", "xsi:schemaLocation", "CDATA", "/nodes.xsd");
transformerHandler.startElement("", "", "node_list", atts);

// displayName element
if (displayName != null) {
    transformerHandler.startElement("", "", "display_name", null);
    ch = displayName.toCharArray();
    transformerHandler.characters(ch, 0, ch.length);
    transformerHandler.endElement("", "", "display_name");
}

// nodes element
transformerHandler.startElement("", "", "nodes", null);

atts.clear();
atts.addAttribute("", "", "node_type", "CDATA", "sometype");
transformerHandler.startElement("", "", "node", atts);

ch = node.getValue().toCharArray();
transformerHandler.startElement("", "", "value", null);
transformerHandler.characters(ch, 0, ch.length);
transformerHandler.endElement("", "", "value");

transformerHandler.endElement("", "", "node");

transformerHandler.endElement("", "", "nodes");

transformerHandler.endElement("", "", "node_list");

transformerHandler.endDocument();

String xml = writer.toString();

他のヒント

SAX ハンドラー インターフェイスは、実装が簡単になるように設計されています。同様のクラス (おそらく SAX インターフェイスをラップする) を作成して呼び出しを容易にすることは簡単です (チェーン化、どの要素を閉じるか覚えておく、より簡単な属性など)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top