2010-11-16 3 views
2

Я хочу, чтобы удалить оболочку из следующего документа XML с помощью DOM APIКак удалить корневой узел документа XML с DOM

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

так, что у меня будет только их в качестве окончательного вывода:

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

Как я могу это сделать на Java?

+2

Вывод, который вы хотите, не является допустимым XML-документом. Вам нужно было бы создать два отдельных документа и сериализовать их один за другим. Почему вы хотите создать недопустимый документ? –

ответ

3

Что вы хотите сделать, не приведет к хорошо сформированному XML, так как в корневом документе будет два элемента. Однако код, который вы хотите сделать, ниже. Он получает дочерние узлы элемента оболочки, создает новый документ для каждого узла, импортирует узел в документ и записывает документ в строку.

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); –

+0

Хммм. Я попробовал это, прежде чем отправил ответ, и это сработало. Я использую SUN JDK 6 для Linux. Что вы используете? – corriganjc

+0

@Farouk, я внесла небольшое изменение в код. Я заменил appendChild с insertBefore. – corriganjc

Смежные вопросы