首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何匹配CIM/RDF中的JAXB元素?

如何匹配CIM/RDF中的JAXB元素?
EN

Stack Overflow用户
提问于 2014-03-16 04:40:27
回答 1查看 889关注 0票数 1

尝试根据IEC 61970 (公共信息模型,用于电力系统模型)从CIM/XML文件加载模型时,我发现了一个问题;根据JAXB的图形,元素之间的图形是由@XmlREF @XmlID提供的,这两者应该相等才能匹配。但是在CIM/RDF中,通过ID对资源的引用,即rdf:resource="#_37C0E103000D40CD812C47572C31C0AD“包含"#”字符,因此JAXB无法匹配"GeographicalRegion“与.在rdf:resource属性中出现"#“字符时使用"SubGeographicalRegion.Region”。

下面是一个示例:

代码语言:javascript
复制
<cim:GeographicalRegion rdf:ID="_37C0E103000D40CD812C47572C31C0AD">
<cim:IdentifiedObject.name>GeoRegion</cim:IdentifiedObject.name>
<cim:IdentifiedObject.localName>OpenCIM3bus</cim:IdentifiedObject.localName>
</cim:GeographicalRegion>
<cim:SubGeographicalRegion rdf:ID="_ID_SubGeographicalRegion">
<cim:IdentifiedObject.name>SubRegion</cim:IdentifiedObject.name>
<cim:IdentifiedObject.localName>SubRegion</cim:IdentifiedObject.localName>
<cim:SubGeographicalRegion.Region rdf:resource="#_37C0E103000D40CD812C47572C31C0AD"/>
</cim:SubGeographicalRegion>
EN

回答 1

Stack Overflow用户

发布于 2014-03-20 03:20:43

我知道您要求的是使用JAXB的解决方案,但我强烈建议您考虑基于RDF的解决方案,因为它更灵活、更健壮。您基本上是在尝试重新发明RDF解析器已经内置的东西。RDF/XML是一种难以解析的格式,尝试将您自己的解析组合在一起没有多大意义-特别是因为具有完全不同的XML结构的文件可以表达完全相同的信息:只有在查看RDF级别时,这一点才会变得明显。您可能会发现,您的JAXB解析器可以在一个CIM/RDF文件上工作,但在另一个文件上完全失败。

因此,这里有一个如何使用Sesame RDF API处理文件的示例。不涉及推断,这只是解析文件并将其放入内存中的RDF模型,然后您可以从任何角度对其进行操作和查询。

假设您的CIM文件的根元素如下所示:

代码语言:javascript
复制
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
         xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" 
         xmlns:cim="http://example.org/cim/">

(当然,这只是一种猜测,但我需要一个正确的示例的前缀)

然后,您可以使用Sesame的Rio RDF/XML解析器执行以下操作:

代码语言:javascript
复制
 String baseURI = "http://example.org/my/file";
 FileInputStream in = new FileInputStream("/path/to/my/cim.rdf"); 
 Model model = Rio.parse(in, baseURI, RDFFormat.RDFXML);

这将创建文档的内存中RDF模型。然后,您可以简单地对其进行过滤查询。例如,打印出以_37C0E103000D40CD812C47572C31C0AD作为其SubGeographicalRegion.Region的所有资源的属性

代码语言:javascript
复制
 String CIM_NS = "http://example.org/cim/";
 ValueFactory vf = ValueFactoryImpl.getInstance();
 URI subRegion = vf.createURI(CIM_NS, "SubGeographicalRegion.Region");
 URI res = vf.createURI("http://example.org/my/file#_37C0E103000D40CD812C47572C31C0AD");
 Set<Resource> subs = model.filter(null, subRegion, res).subjects();

 for (Resource sub: subs) {
     System.out.println("resource: " + sub + " has the following properties: ");
     for (URI prop: model.filter(sub, null, null).predicates()) {
          System.out.println(prop + ": " + model.filter(sub, prop, null).objectValue());
     }
 } 

当然,在这一点上,您还可以选择将模型转换为其他一些语法格式,以便应用程序进一步处理-如果您认为合适的话。关键是RDF/XML解析器已经为您解决了带有前导#的标识符和没有前导XML的标识符之间的差异。

这当然只是我个人的观点,因为我不知道你的用例的细节,但我想你会发现这是相当迅速和灵活的。我还应该指出的是,尽管上面的解决方案将整个模型保存在内存中,但如果您发现文件太大,您可以很容易地将其调整为更多的流(因此内存密集度更低)的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22429483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档