我正在使用StAX使用XMLStreamWriter
构建XML文档。
但是,我的文档中有一些部分很难逐个调用XMLStreamWriter的方法,使用DOM构造一个小文档片段会更容易,然后将其写出来。
我知道如何使用DOM,但这是我的问题:是否可以通过简单的方法获取Element
对象并将其写入XMLStreamWriter
?
我可以弄清楚如何“连接”这两种方法,但看起来它会很乏味。应该已经存在的东西了。 (另一种方式似乎是微不足道的:http://blogs.oracle.com/venu/entry/constructing_dom_using_stax_writers)
答案 0 :(得分:2)
没关系,我得到的东西涵盖了基础知识(不确定它是否适用于名称空间,但它似乎适用于简单的DOM节点树):
public static void writeDomToXmlStreamWriter(Node node, XMLStreamWriter xmlw) throws XMLStreamException
{
if (node != null)
{
switch (node.getNodeType())
{
case Node.ELEMENT_NODE:
{
Element element = (Element)node;
if (element.getPrefix() != null)
xmlw.writeStartElement(element.getPrefix(), element.getLocalName(), element.getNamespaceURI());
else if (element.getNamespaceURI() != null)
xmlw.writeStartElement(element.getNamespaceURI(), element.getLocalName());
else if (element.getLocalName() != null)
xmlw.writeStartElement(element.getLocalName());
else
xmlw.writeStartElement(element.getNodeName());
writeDomAttributesToXmlStreamWriter(element, xmlw);
for (Node child = element.getFirstChild(); child != null; child = child.getNextSibling())
writeDomToXmlStreamWriter(child, xmlw);
xmlw.writeEndElement();
}
break;
case Node.TEXT_NODE:
{
xmlw.writeCharacters(node.getTextContent());
}
}
}
}
private static void writeDomAttributesToXmlStreamWriter(Element element, XMLStreamWriter xmlw) throws XMLStreamException
{
NamedNodeMap map = element.getAttributes();
for (int L = map.getLength(), i = 0; i < L; ++i)
{
Node attr = map.item(i);
if (attr.getPrefix() != null)
xmlw.writeAttribute(attr.getPrefix(), attr.getLocalName(), attr.getNamespaceURI(), attr.getNodeValue());
else if (attr.getNamespaceURI() != null)
xmlw.writeAttribute(attr.getNamespaceURI(), attr.getLocalName(), attr.getNodeValue());
else if (attr.getLocalName() != null)
xmlw.writeAttribute(attr.getLocalName(), attr.getNodeValue());
else
xmlw.writeAttribute(attr.getNodeName(), attr.getNodeValue());
}
}
答案 1 :(得分:0)
您可以使用javax.xml.transform库。您可以将包含在DOMSource中的DOM转换为包装流编写器的StAXResult。
基本上它是这里描述的方法的写版本: