簡體   English   中英

Java XML:結合使用DOM和StAX來構建文檔

[英]Java XML: using DOM with StAX to construct a document

我正在使用StAX使用XMLStreamWriter構造XML文檔。

但是,在我的文檔的某些部分中,很難一一調用XMLStreamWriter的方法,並且使用DOM構造一個小的文檔片段然后將其寫出來會更容易。

我知道如何使用DOM,但這是我的問題:是否有一種簡單的方法來獲取Element對象並將其寫到XMLStreamWriter

我大概可以弄清楚如何“連接”這兩種方法,但似乎很乏味,而且應該已經有了一些東西。 (采用另一種方法似乎很簡單: http : //blogs.oracle.com/venu/entry/constructing_dom_using_stax_writers

沒關系,我有一些介紹基礎知識的東西(不確定它是否可以使用名稱空間,但似乎可以使用簡單的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());
    }       
}

您可以使用javax.xml.transform庫。 您可以將包裝在DOMSource中的DOM轉換為包裝您的流編寫器的StAXResult。

本質上,它是此處描述的方法的寫入版本:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM