具体做法如下,
因为保存和加载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());
- }
安徽新华电脑学校专业职业规划师为你提供更多帮助【在线咨询】