我从一个XML模式生成一个EMF模型,从第一眼看起来一切都很好但在EMF运行时实例中我只能用它的String" name"来访问属性特征。但价值" / firstfloor ..."未在EMF中设置。知道为什么吗?
提前致谢!
xml的一部分如下所示:
<aspectvalue feature="name">/firstfloor/temperature/CurrentRoomTemp</aspectvalue>
xsd架构的一部分,如下所示:
<xs:complexType name="FeatureListType">
<xs:sequence>
<xs:element name="feature" minOccurs="1" maxOccurs="unbounded" type="FeatureType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="FeatureType">
<xs:attribute name="name" use="required" type="NameType" />
<xs:attribute name="optional" use="optional" type="xs:boolean" />
<xs:attribute name="deprecated" use="optional" type="xs:boolean" />
</xs:complexType>
答案 0 :(得分:0)
我终于找到了答案。我必须修改ecore模型并将aspectvalue标签名称设置为&#34;上限:-1&#34;。 EMF更改模型而不是值设置器&#34; setValue&#34;我可以添加一个集合作为值。有点奇怪,但它有效我可以生成上面的xml并将其读入EMF模型。
保存EMF实例
Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
Map<String, Object> m = reg.getExtensionToFactoryMap();
m.put("xml", new XMLResourceFactoryImpl());
ResourceSet resSet = new ResourceSetImpl();
Resource resource = resSet.createResource(URI.createFileURI("/tmp/test.xml"));
resource.getContents().add(emfModelData);
resource.save(Collections.EMPTY_MAP);
阅读EMF
EPackage.Registry.INSTANCE.put(LibraryPackage.eNS_URI, LibraryPackage.eINSTANCE);
// add file extension to registry
ResourceFactoryRegistryImpl.INSTANCE.getExtensionToFactoryMap().put("xml", new GenericXMLResourceFactoryImpl());
Resource resource = new XMLResourceImpl(URI.createFileURI("/tmp/test.xml"));
resource.load(Collections.EMPTY_MAP);
EObject root = resource.getContents().get(0);
System.out.println(root);