Java XML: использование DOM с StAX для создания документа - PullRequest
4 голосов
/ 05 марта 2011

Я использую StAX для создания XML-документа, используя XMLStreamWriter.

Тем не менее, есть части моего документа, в которых трудно сделать вызовы методов XMLStreamWriter один за другим, и было бы проще создать небольшой фрагмент документа с использованием DOM, а затем записать это.

Я знаю, как использовать DOM, но вот мой вопрос: есть ли простой способ взять объект Element и записать его в XMLStreamWriter?

Я, наверное, могу понять, как "соединить" два метода, но кажется, что это было бы утомительно и что-то уже должно быть. (идти другим путем кажется тривиальным: http://blogs.oracle.com/venu/entry/constructing_dom_using_stax_writers)

Ответы [ 2 ]

2 голосов
/ 05 марта 2011

не берите в голову, я получил кое-что, что покрывает основы (не уверен, что это будет работать с пространствами имен, но это, кажется, работает с простым деревом узла 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());
    }       
}
0 голосов
/ 05 марта 2011

Вы можете использовать библиотеки javax.xml.transform.Вы можете преобразовать DOM, обернутый в DOMSource, в StAXResult, обертывающий вашу потоковую запись.

По сути, это версия записи, описанная здесь:

...