2010-11-16 29 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