javaxml:使用DOM和StAX构建文档

javaxml:使用DOM和StAX构建文档,java,xml,dom,stax,Java,Xml,Dom,Stax,我使用StAX使用 然而,在我的文档中,有一些部分很难逐个调用XMLStreamWriter的方法,使用DOM构造一个小文档片段,然后写出它会更容易 我知道如何使用DOM,但我的问题是:有没有一种简单的方法可以将对象写入XMLStreamWriter 我也许能想出如何“连接”这两种方法,但这似乎很乏味&应该已经有了一些东西。(走另一条路似乎很简单:)没关系,我得到了一些基本的东西(不确定它是否可以使用名称空间,但似乎可以使用简单的DOM节点树): public static void write

我使用StAX使用

然而,在我的文档中,有一些部分很难逐个调用XMLStreamWriter的方法,使用DOM构造一个小文档片段,然后写出它会更容易

我知道如何使用DOM,但我的问题是:有没有一种简单的方法可以将对象写入
XMLStreamWriter


我也许能想出如何“连接”这两种方法,但这似乎很乏味&应该已经有了一些东西。(走另一条路似乎很简单:)

没关系,我得到了一些基本的东西(不确定它是否可以使用名称空间,但似乎可以使用简单的DOM节点树):

public static void writeDomToXmlStreamWriter(节点,XMLStreamWriter xmlw)抛出XMLStreamException
{
如果(节点!=null)
{
开关(node.getNodeType())
{
案例节点。元素节点:
{
元素=(元素)节点;
if(element.getPrefix()!=null)
writeStarteElement(element.getPrefix()、element.getLocalName()、element.getNamespaceURI());
else if(element.getNamespaceURI()!=null)
writeStarteElement(element.getNamespaceURI(),element.getLocalName());
else if(element.getLocalName()!=null)
writeStarteElement(element.getLocalName());
其他的
writeStart元素(element.getNodeName());
writedMattPropertiesToxmlStreamWriter(元素,xmlw);
对于(节点child=element.getFirstChild();child!=null;child=child.getNextSibling())
WriteDomainToxmlStreamWriter(子级,xmlw);
xmlw.writeEndElement();
}
打破
案例节点.TEXT\u节点:
{
writeCharacters(node.getTextContent());
}
}
}
}
私有静态void writedMattPropertiesToXmlStreamWriter(元素,XMLStreamWriter xmlw)引发XMLStreamException
{
NamedNodeMap=element.getAttributes();
对于(int L=map.getLength(),i=0;i
您可以使用javax.xml.transform库。您可以将包装在DOMSource中的DOM转换为包装流编写器的StAXResult

本质上,它是这里描述的方法的编写版本:

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());
    }       
}