2012-07-06 134 views
0

我開發了一種方法在XML文件中插入新元素。我正在測試它讀取輸入文件的第一個元素Usuario並在最後附加它。錯誤的XML解析Java

輸入:

<Usuarios> 
     <Usuario> 
       <id>identificador</id> 
       <email>[email protected]</email> 
       <rol>profesor</rol> 
       <alta>01/01/2012</alta> 
       <baja>30/08/2021</baja> 
     </Usuario> 
     <Usuario> 
       <id>00000000H</id> 
       <email>[email protected]</email> 
       <rol>profesor</rol> 
       <alta>01/01/2012</alta> 
       <baja>30/08/2021</baja> 
     </Usuario> 
     <Usuario> 
       <id>970104</id> 
       <email>[email protected]</email> 
       <rol>alumno</rol> 
       <alta>01/01/2012</alta> 
       <baja>30/08/2021</baja> 
     </Usuario> 
</Usuarios> 

輸出:

<Usuarios> 
     <Usuario> 
       <id>identificador</id> 
       <email>[email protected]</email> 
       <rol>profesor</rol> 
       <alta>01/01/2012</alta> 
       <baja>30/08/2021</baja> 
     </Usuario> 
     <Usuario> 
       <id>00000000H</id> 
       <email>[email protected]</email> 
       <rol>profesor</rol> 
       <alta>01/01/2012</alta> 
       <baja>30/08/2021</baja> 
     </Usuario> 
     <Usuario> 
       <id>970104</id> 
       <email>[email protected]</email> 
       <rol>alumno</rol> 
       <alta>01/01/2012</alta> 
       <baja>30/08/2021</baja> 
     </Usuario> 
<Usuario> 
     <id>identificador</id> 
     <email>[email protected]</email> 
     <rol>profesor</rol> 
     <alta>01/01/2012</alta> 
     <baja>30/08/2021</baja> 
    </Usuario> 
</Usuarios> 

我在做什麼不好?有兩個問題:

1.-輸入中的元素未正確縮進輸出文件。變壓器不會重新註冊所有的寄存器? 2.-新元素正確縮進,但不是新的實例。

想法?

來源:

public void almacenarUsuario(UsuarioNegocio usuario) throws Exception { 
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
    Document doc = dBuilder.parse(new File(directorio + "personas.xml")); 

    Element nUsuario = (Element) doc.getElementsByTagName("Usuarios").item(0); 
    Node node = doc.createElement("Usuario");   
    nUsuario.appendChild(node);   

    Element nid = doc.createElement("id");   
    nid.appendChild(doc.createTextNode(usuario.getIdUsuario())); 
    node.appendChild(nid); 

    Element nemail = doc.createElement("email");   
    nemail.appendChild(doc.createTextNode(usuario.getEmail())); 
    node.appendChild(nemail); 

    Element nrol = doc.createElement("rol");   
    nrol.appendChild(doc.createTextNode(usuario.getRol())); 
    node.appendChild(nrol); 

    Element nalta = doc.createElement("alta");   
    nalta.appendChild(doc.createTextNode(usuario.getFecha_alta())); 
    node.appendChild(nalta); 

    Element nbaja = doc.createElement("baja");   
    nbaja.appendChild(doc.createTextNode(usuario.getFecha_baja())); 
    node.appendChild(nbaja);  

    // Formatter //          
    TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
    transformerFactory.setAttribute("indent-number", new Integer(25)); 
    Transformer transformer = transformerFactory.newTransformer(); 
    transformer.setOutputProperty(OutputKeys.METHOD, "xml"); 
    transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8"); 
    transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
    transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
    transformer.setOutputProperty("{http://xml.apache.org/xalan}indent-amount","4");   

    DOMSource source = new DOMSource(doc); 
    StreamResult result = new StreamResult(new File("/opt/icxp1/Temporal/jose/personal/nuevo.xml")); 
    transformer.transform(source, result); 
} 
+1

爲什麼你關心縮進?這不會以任何方式使XML無效,是嗎? – Qnan 2012-07-06 11:13:07

+1

它必須由人讀取和縮進幫助... – minyatur 2012-07-06 11:21:15

回答

3

轉化之前,

transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
+0

它在那裏... '代碼' transformer.setOutputProperty(OutputKeys.METHOD,「xml」); transformer.setOutputProperty(OutputKeys.ENCODING,「utf-8」); transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,「yes」); transformer.setOutputProperty(OutputKeys.INDENT,「yes」); transformer.setOutputProperty(「{xml.apache.org/xalan}indent-amount","4」); DOMSource source = new DOMSource(doc); 'code' – minyatur 2012-07-06 12:43:03

+1

爲什麼在原始文檔中的8位時將縮進量設置爲4? – Qnan 2012-07-06 14:24:36

+0

沒有特別的原因,但代碼無法正常工作 – minyatur 2012-07-07 07:43:47