2010-11-16 36 views
2

删除XML文档的根节点我想使用DOM API如何使用DOM

<hs:PageWrapper> 
    <div id="botton1"/> 
    <div id="botton2"/> 
</hs:PageWrapper> 

所以请从下面的XML文档的包装,我只会有这些作为最终输出:

<div id="botton1"/> 
<div id="botton2"/> 

我该如何在Java中做到这一点?

+2

您要的输出不是有效的XML文档。您将不得不创建两个单独的文档并逐个序列化它们。为什么你想要产生一个无效的文件? – 2010-11-16 21:33:27

回答

3

你想要做的事不会导致格式良好的XML,因为在文档根目录下会有2个元素。但是,执行你想要的代码在下面。它获取包装器元素的子节点,为每个节点创建一个新文档,将节点导入文档并将文档写入String。

public String peel(String xmlString) { 
    StringWriter writer = new StringWriter(); 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    try { 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     Document document = builder.parse(new InputSource(new StringReader(
       xmlString))); 
     NodeList nodes = document.getDocumentElement().getChildNodes(); 
     for (int i = 0; i < nodes.getLength(); i++) { 
      Node n = nodes.item(i); 
      Document d = builder.newDocument(); 
      Node newNode = d.importNode(n, true); 
      d.insertBefore(newNode, null); 
      writeOutDOM(d, writer); 
     } 
    } catch (ParserConfigurationException e) { 
     e.printStackTrace(); 
    } catch (SAXException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (TransformerFactoryConfigurationError e) { 
     e.printStackTrace(); 
    } catch (TransformerException e) { 
     e.printStackTrace(); 
    } 
    return writer.toString(); 
} 

protected void writeOutDOM(Document doc, Writer writer) 
    throws TransformerFactoryConfigurationError, TransformerException { 
    Result result = new StreamResult(writer); 
    DOMSource domSource = new DOMSource(doc); 
    Transformer transformer = TransformerFactory.newInstance() 
      .newTransformer(); 
    transformer.setOutputProperty("omit-xml-declaration", "yes"); 
    transformer.transform(domSource, result); 
} 
+0

嗨非常感谢你。我试过,并且出现以下错误:HIERARCHY_REQUEST_ERR:试图插入不允许的节点。这发生在行d.appendChild(newNode); – 2010-11-16 22:17:42

+0

嗯。我在发布答案之前尝试了它,并且它工作正常。我在Linux上使用SUN JDK 6。你在用什么? – corriganjc 2010-11-16 22:26:10

+0

@Farouk,我对代码做了一些小改动。我用insertBefore替换了appendChild。 – corriganjc 2010-11-16 22:38:33