2011-03-04 56 views
4

我使用StAX使用XMLStreamWriter构建XML文档。Java XML:使用DOM和StAX构建文档

但是,在我的文档中有很多部分难以逐个调用XMLStreamWriter的方法,并且使用DOM构造小文档片段会更容易,然后将其写出。

我知道如何使用DOM,但这里是我的问题:是否有一种简单的方法可以将Element对象写出来并写入XMLStreamWriter

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

回答

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

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

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