Обновить частичное сопоставление XML для bean-компонента
Мне нужно отобразить подмножество XML-файлов узлов на Java Bean.
Например карта
<data>
<field1>Value</field1>
<field2>Value</field2>
<field3>Value</field3>
<field4>Value</field4>
<field5>Value</field5>
</data>
в
public class DataBean {
private String field2;
private String field5;
// ...getter/setter
}
затем манипулируйте bean-компонентом и обновляйте исходный XML-файл, не теряя элементы, которые не отображаются. Как я могу использовать это сделать? Какая библиотека?
Спасибо за помощь, Маурицио
2 ответа
Примечание. Я являюсь руководителем EclipseLink JAXB (MOXy) и членом группы экспертов JAXB 2 (JSR-222).
Ниже показано, как это можно сделать с помощью реализации JAXB в MOXy. Binder
:
DataBean
package forum9988170;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="data")
public class DataBean {
private String field2;
private String field5;
public String getField2() {
return field2;
}
public void setField2(String field2) {
this.field2 = field2;
}
public String getField5() {
return field5;
}
public void setField5(String field5) {
this.field5 = field5;
}
}
jaxb.properties
Чтобы указать MOXy в качестве поставщика JAXB, вам нужно добавить файл с именем jaxb.properties
в том же пакете, что и классы вашего домена со следующей записью,
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
демонстрация
package forum9988170;
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.Document;
import org.w3c.dom.Node;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(DataBean.class);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
File xml = new File("src/forum9988170/input.xml");
Document document = db.parse(xml);
Binder<Node> binder = jc.createBinder();
DataBean dataBean = (DataBean) binder.unmarshal(document);
dataBean.setField2("NEW FIELD 2");
dataBean.setField5("NEW FIELD 5");
binder.updateXML(dataBean);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(System.out);
t.transform(source, result);
}
}
Выход
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<data>
<field1>Value</field1>
<field2>NEW FIELD 2</field2>
<field3>Value</field3>
<field4>Value</field4>
<field5>NEW FIELD 5</field5>
</data>
Для дополнительной информации
Если вы решите, что входит в структуру xml, вы можете использовать XStream ( http://x-stream.github.io/) для сериализации и десериализации. Но если вы производите десериализацию только из xml в bean (из иностранного формата), вам следует использовать Smooks ( http://www.smooks.org/).
Обе эти библиотеки очень легкие в отличие от JAXB. JAXB не является гибким и требует создания схемы XML. Я не рекомендую, потому что вы теряете больше времени, чем на простой анализ DOM.
JAXB очень академичен. Пример: многие из "конвертов SOAP" не полностью описаны в документах WSDL, но добавляют некоторое количество XML в поле WSDL (в простом текстовом поле). В таком случае вы теряете много времени на создание инфраструктуры JAXB...
Конечно это только мое личное мнение. Но помните эти два инструмента и попробуйте их использовать. Вы увидите, что это действительно стоит.