如何使用Java1.4和SAX将任意数据编码为XML?

如何使用Java1.4和SAX将任意数据编码为XML?,java,xml,sax,Java,Xml,Sax,我们使用SAX来解析XML,因为它不需要为了解析单个值而将整个XML文档读入内存。我读过很多文章,坚持SAX只能用于解析/解码XML,而不能创建它。这是真的吗?不,这不是真的,您可以使用类似于以下内容的方法将XML编码到Java中的任何编写器: char[] ch; AttributesImpl atts = new AttributesImpl(); Writer writer = new StringWriter(); StreamResult streamResult = new Stre

我们使用SAX来解析XML,因为它不需要为了解析单个值而将整个XML文档读入内存。我读过很多文章,坚持SAX只能用于解析/解码XML,而不能创建它。这是真的吗?

不,这不是真的,您可以使用类似于以下内容的方法将XML编码到Java中的任何编写器:

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接口)很容易,以便于调用链接、记住要关闭的元素、更简单的属性等。

这是否通过使用XSLT处理器在内存中构建了整个文档?我知道这是一个老话题,但这段代码没有完全起作用。将来可能会有人使用此解决方案并尝试运行上面的代码。