EMF的存储设置

一般我们在对EMF模型内容进行输出,这里需要进行一些定制,下面是我在项目中做的一些定制,第一个是要将EMF Model输出的xml中去掉一些名称空间的信息,第二个就是希望把某些信息由Attribute类型转换成Content类型,在得到的content类型的内容默认情况下会对<, >, &等字符进行转换,这个也可以进行控制。借鉴EMF开发指南的做法,其实很简单,这里要注意save和load使用的控制选项设置必须一致。
具体做法如下,
因为保存和加载xml是在XMLResourceImpl里面进行的,所以我们需要从该类继承,overriding 相应的load和save方法,然后在使用到XMLResourceImpl的地方改成使用我们的派生之类,在定制的子类中,我们做了如下实现:
java 代码
  1. public void load(Map options) throws IOException {   
  2.     super.load(addOptions(options));   
  3. }   
  4.   
  5. public void save(Map options) throws IOException {   
  6.     super.save(addOptions(options));   
  7. }   
  8.   
  9. /**  
  10.  * 设置序列化/反序列化选项  
  11.  *   
  12.  * @param options  
  13.  */  
  14. private Map addOptions(Map options) {   
  15.     // 这里的map只应创建一次   
  16.     XMLResource.XMLMap xmlMap = new XMLMapImpl();   
  17.   
  18.     EPackage ePackage = Configuration.INSTANCE.getViewEPackage();   
  19.     XMLResource.XMLInfo info = new XMLInfoImpl();   
  20.     info.setXMLRepresentation(XMLResource.XMLInfo.CONTENT);   
  21.   
  22.     // 将event的内容在attribute和content之间转换   
  23.     EClass eClass = (EClass) ePackage   
  24.             .getEClassifier(Configuration.EVENT_NAME);   
  25.     xmlMap.add(eClass   
  26.             .getEStructuralFeature(Configuration.EVENT_ATTRIBUTE_CONTENT),   
  27.             info);   
  28.   
  29.     // 在生成的ddxml中去掉namespace声明   
  30.     xmlMap.setNoNamespacePackage(ePackage);   
  31.   
  32.     if (options == Collections.EMPTY_MAP) {   
  33.         options = new HashMap();   
  34.     }   
  35.        
  36.     options.put(XMLResource.OPTION_XML_MAP, xmlMap);   
  37.        
  38.     // 避免对<,>,&等字符进行转换   
  39.     options.put(XMLResource.OPTION_SKIP_ESCAPE, Boolean.TRUE);   
  40.   
  41.     return options;   
  42. }  

 

因为我们这里没有对特殊字符进行转换,所以我们需要在生成的content类型的内容加上<![CDATA, ]]>, 这个我们需要生成自己的XMLSaveImpl,然后overriding getContent(EObject o, EStructuralFeature[] features)这个方法:

java 代码
  1. protected String getContent(EObject o, EStructuralFeature[] features) {   
  2.     if (map == null)   
  3.     {   
  4.       return null;   
  5.     }   
  6.   
  7.     for (int i = 0; i < features.length; i++)   
  8.     {   
  9.       EStructuralFeature feature = features[i];   
  10.       XMLResource.XMLInfo info = map.getInfo(feature);   
  11.       if (info != null && info.getXMLRepresentation() == XMLResource.XMLInfo.CONTENT)   
  12.       {   
  13.         Object value = helper.getValue(o, feature);   
  14.         String svalue = getDatatypeValue(value, feature, false);   
  15.         if (toDOM)   
  16.         {               
  17.           Node text = document.createTextNode(svalue);   
  18.           currentNode.appendChild(text);   
  19.           handler.recordValues(text, o, feature, value);   
  20.         }else {   
  21.             // 将内容前后加上<![CDATA and ]]>   
  22.             svalue = "<![CDATA[\n" +svalue + "\n]]>";   
  23.         }   
  24.         return svalue;   
  25.       }   
  26.     }   
  27.     return null;   
  28. }   

 当然了还必须在前面自己的XMLResourceImpl类里面重载createXMLSave()方法:

 

java 代码
  1. protected XMLSave createXMLSave() {   
  2.     return new DoradoXMLSaveImpl(createXMLHelper());   
  3. }  
提供了基于BP(Back Propagation)神经网络结合PID(比例-积分-微分)控制策略的Simulink仿真模型。该模型旨在实现对杨艺所著论文《基于S函数的BP神经网络PID控制器及Simulink仿真》中的理论进行实践验证。在Matlab 2016b环境下开发,经过测试,确保能够正常运行,适合学习和研究神经网络在控制系统中的应用。 特点 集成BP神经网络:模型中集成了BP神经网络用于提升PID控制器的性能,使之能更好地适应复杂控制环境。 PID控制优化:利用神经网络的自学习能力,对传统的PID控制算法进行了智能调整,提高控制精度和稳定性。 S函数应用:展示了如何在Simulink中通过S函数嵌入MATLAB代码,实现BP神经网络的定制化逻辑。 兼容性说明:虽然开发于Matlab 2016b,但理论上兼容后续版本,可能会需要调整少量配置以适配不同版本的Matlab。 使用指南 环境要求:确保你的电脑上安装有Matlab 2016b或更高版本。 模型加载: 下载本仓库到本地。 在Matlab中打开.slx文件。 运行仿真: 调整模型参数前,请先熟悉各模块功能和输入输出设置。 运行整个模型,观察控制效果。 参数调整: 用户可以自由调节神经网络的层数、节点数以及PID控制器的参数,探索不同的控制性能。 学习和修改: 通过阅读模型中的注释和查阅相关文献,加深对BP神经网络与PID控制结合的理解。 如需修改S函数内的MATLAB代码,建议有一定的MATLAB编程基础。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值