5

我正在使用 StAX 使用XMLStreamWriter.

但是,我的文档的某些部分很难逐个调用 XMLStreamWriter 的方法,使用 DOM 构造一个小的文档片段然后写出来会更容易。

我知道如何使用 DOM,但这是我的问题:有没有一种简单的方法来获取一个Element对象并将其写入一个XMLStreamWriter?

我大概可以弄清楚如何“连接”这两种方法,但它似乎很乏味,而且应该已经有了一些东西。(走另一条路似乎微不足道:http: //blogs.oracle.com/venu/entry/constructing_dom_using_stax_writers

4

2 回答 2

3

没关系,我得到了一些涵盖基础知识的东西(不确定它是否可以使用命名空间,但它似乎可以使用简单的 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());
    }       
}
于 2011-03-04T22:19:50.540 回答
0

您可以使用 javax.xml.transform 库。您可以将包装在 DOMSource 中的 DOM 转换为包装流编写器的 StAXResult。

本质上,它是此处描述的方法的编写版本:

于 2011-03-04T22:25:48.960 回答