具體做法如下,
因為保存和加載xml是在XMLResourceImpl里面進行的,所以我們需要從該類繼承,overriding 相應的load和save方法,然后在使用到XMLResourceImpl的地方改成使用我們的派生之類,在定制的子類中,我們做了如下實現:
java 代碼
- public void load(Map options) throws IOException {
- super.load(addOptions(options));
- }
- public void save(Map options) throws IOException {
- super.save(addOptions(options));
- }
- /**
- * 設置序列化/反序列化選項
- *
- * @param options
- */
- private Map addOptions(Map options) {
- // 這里的map只應創建一次
- XMLResource.XMLMap xmlMap = new XMLMapImpl();
- EPackage ePackage = Configuration.INSTANCE.getViewEPackage();
- XMLResource.XMLInfo info = new XMLInfoImpl();
- info.setXMLRepresentation(XMLResource.XMLInfo.CONTENT);
- // 將event的內容在attribute和content之間轉換
- EClass eClass = (EClass) ePackage
- .getEClassifier(Configuration.EVENT_NAME);
- xmlMap.add(eClass
- .getEStructuralFeature(Configuration.EVENT_ATTRIBUTE_CONTENT),
- info);
- // 在生成的ddxml中去掉namespace聲明
- xmlMap.setNoNamespacePackage(ePackage);
- if (options == Collections.EMPTY_MAP) {
- options = new HashMap();
- }
- options.put(XMLResource.OPTION_XML_MAP, xmlMap);
- // 避免對<,>,&等字符進行轉換
- options.put(XMLResource.OPTION_SKIP_ESCAPE, Boolean.TRUE);
- return options;
- }
因為我們這里沒有對特殊字符進行轉換,所以我們需要在生成的content類型的內容加上<![CDATA, ]]>, 這個我們需要生成自己的XMLSaveImpl,然后overriding getContent(EObject o, EStructuralFeature[] features)這個方法:
java 代碼
- protected String getContent(EObject o, EStructuralFeature[] features) {
- if (map == null)
- {
- return null;
- }
- for (int i = 0; i < features.length; i++)
- {
- EStructuralFeature feature = features[i];
- XMLResource.XMLInfo info = map.getInfo(feature);
- if (info != null && info.getXMLRepresentation() == XMLResource.XMLInfo.CONTENT)
- {
- Object value = helper.getValue(o, feature);
- String svalue = getDatatypeValue(value, feature, false);
- if (toDOM)
- {
- Node text = document.createTextNode(svalue);
- currentNode.appendChild(text);
- handler.recordValues(text, o, feature, value);
- }else {
- // 將內容前后加上<![CDATA and ]]>
- svalue = "<![CDATA[\n" +svalue + "\n]]>";
- }
- return svalue;
- }
- }
- return null;
- }
當然了還必須在前面自己的XMLResourceImpl類里面重載createXMLSave()方法:
java 代碼
- protected XMLSave createXMLSave() {
- return new DoradoXMLSaveImpl(createXMLHelper());
- }
安徽新華電腦學校專業職業規劃師為你提供更多幫助【在線咨詢】