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
Gracias, esa es la respuesta que estaba buscando. – jonas789
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
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