2011-05-19 12 views

Respuesta

7

Puede utilizar el JAXB Binder para este caso de uso:

input.xml

<?xml version="1.0" encoding="UTF-8"?> 
<customer> 
    <UNMAPPED_ELEMENT_1/> 
    <name>Jane Doe</name> 
    <!-- COMMENT #1 --> 
    <address> 
     <UNMAPPED_ELEMENT_2/> 
     <street>1 A Street</street> 
     <!-- COMMENT #2 --> 
     <UNMAPPED_ELEMENT_3/> 
     <city>Any Town</city> 
    </address> 
    <!-- COMMENT #3 --> 
    <UNMAPPED_ELEMENT_4/> 
    <phone-number type="home">555-HOME</phone-number> 
    <!-- COMMENT #4 --> 
    <phone-number type="cell">555-CELL</phone-number> 
    <UNMAPPED_ELEMENT_5/> 
    <!-- COMMENT #5 --> 
</customer> 

demostración

import java.io.File; 
import javax.xml.bind.*; 
import javax.xml.parsers.*; 
import javax.xml.transform.*; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 
import org.w3c.dom.*; 

public class BinderDemo { 

    public static void main(String[] args) throws Exception { 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     File xml = new File("input.xml"); 
     Document document = db.parse(xml); 

     JAXBContext jc = JAXBContext.newInstance(Customer.class); 

     Binder<Node> binder = jc.createBinder(); 
     Customer customer = (Customer) binder.unmarshal(document); 
     customer.getAddress().setStreet("2 NEW STREET"); 
     PhoneNumber workPhone = new PhoneNumber(); 
     workPhone.setType("work"); 
     workPhone.setValue("555-WORK"); 
     customer.getPhoneNumbers().add(workPhone); 
     binder.updateXML(customer); 

     TransformerFactory tf = TransformerFactory.newInstance(); 
     Transformer t = tf.newTransformer(); 
     t.transform(new DOMSource(document), new StreamResult(System.out)); 
    }  
} 

salida

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<customer> 
    <UNMAPPED_ELEMENT_1/> 
    <name>Jane Doe</name> 
    <!-- COMMENT #1 --> 
    <address> 
     <UNMAPPED_ELEMENT_2/> 
     <street>2 NEW STREET</street> 
     <!-- COMMENT #2 --> 
     <UNMAPPED_ELEMENT_3/> 
     <city>Any Town</city> 
    </address> 
    <!-- COMMENT #3 --> 
    <UNMAPPED_ELEMENT_4/> 
    <phone-number type="home">555-HOME</phone-number> 
    <!-- COMMENT #4 --> 
    <phone-number type="cell">555-CELL</phone-number> 
    <phone-number type="work">555-WORK</phone-number> 
    <UNMAPPED_ELEMENT_5/> 
    <!-- COMMENT #5 --> 
</customer> 

Para más información

+0

Gracias, esa es la respuesta que estaba buscando. – jonas789

+0

Extrañamente, el nuevo código de encuadernación no funciona para mí, a pesar de que es casi exactamente igual a mi código anterior de desmaquillaje. Este es el código de trabajo anterior que funciona muy bien: 'File xmlFile = ... File xmlSchema = ... JAXBContext jaxbContext = JAXBContext.newInstance (Process.class); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); unmarshaller.setSchema (SchemaFactory.newInstance (XMLConstants.W3C_XML_SCHEMA_NS_URI) .newSchema (XMLSCHEMA); proceso Proceso = (Proceso) unmarshaller.unmarshal (xmlFile); ' – jonas789

+0

Este es el código de nuevo:' DBF DocumentBuilderFactory = DocumentBuilderFactory.newInstance() ; DocumentBuilder db = dbf.newDocumentBuilder(); documento documento = db.parse (xmlFile); JAXBContext JAXBContext = JAXBContext.newInstance (Process.class); carpeta aglutinante = jaxbContext.createBinder(); binder.setSchema (SchemaFactory.newInstance (XMLConstants.W3C_XML_SCHEMA_NS_URI) .newSchema (xmlSchema); Process process = (Proceso) binder.unmarshal (documento); ' – jonas789

Cuestiones relacionadas