在Eclipse EMF序列化过程中转义>字符的最优方案咨询
解决EMF序列化时额外转义>字符的方案
EMF默认的XML/XMI序列化只会转义<、&、"等必要字符,要让文本字段中的>也被转义为>,无需后处理的最简洁方式是自定义XML序列化器,覆盖其字符转义逻辑:
- 第一步:继承EMF的
XMLSerializer类,重写字符转义方法,添加对>的转义
import org.eclipse.emf.ecore.xmi.impl.XMLSerializerImpl; import org.eclipse.emf.ecore.xmi.XMLResource; import java.util.Map; public class CustomXMLSerializer extends XMLSerializerImpl { public CustomXMLSerializer(XMLResource xmlResource, Map<?, ?> options) { super(xmlResource, options); } @Override protected String escape(char[] chars, int start, int length, boolean isAttribute) { // 先调用父类完成基础转义 String escapedStr = super.escape(chars, start, length, isAttribute); // 额外将>替换为> return escapedStr.replace(">", ">"); } }
- 第二步:自定义
XMLResource,指定使用上述自定义序列化器
import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl; import org.eclipse.emf.ecore.xmi.XMLSerializer; import java.util.Map; import org.eclipse.emf.common.util.URI; public class CustomXMLResource extends XMLResourceImpl { public CustomXMLResource(URI uri) { super(uri); } @Override protected XMLSerializer createXMLSerializer(Map<?, ?> options) { return new CustomXMLSerializer(this, options); } }
- 第三步:注册自定义ResourceFactory,让EMF在序列化时使用这个资源类型
import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.ResourceSetImpl; import org.eclipse.emf.ecore.resource.Resource.Factory; import org.eclipse.emf.ecore.xmi.XMLResource; import java.net.URI; // 初始化ResourceSet时注册自定义工厂 ResourceSet resourceSet = new ResourceSetImpl(); resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap() .put(XMLResource.DEFAULT_EXTENSION, new Factory() { @Override public Resource createResource(URI uri) { return new CustomXMLResource(uri); } });
之后正常使用这个ResourceSet进行EObject的序列化,生成的文件中文本字段里的>就会被自动转义为>,无需额外后处理。
内容的提问来源于stack exchange,提问作者user3726374
相关产品推荐
相关产品推荐

