我正在尝试使用XSD文件验证XML文件,这不起作用,我不知道原因。
我发现我们可以在终端上用这个例子来做:
xmllint --noout --schema owl2-xml.xsd camera.owl
但它会产生错误,我特别不理解。
regexp error : failed to compile: expecting a branch after |
owl2-xml.xsd:30: element pattern: Schemas parser error : Element '{http://www.w3.org/2001/XMLSchema}pattern': The value '([A-Z]|[a-z]|[À-Ö]|[Ø-ö]|[ø-˿]|[Ͱ-ͽ]|[Ϳ-]|[-]|[⁰-]|[Ⰰ-]|[、-]|[豈-﷏]|[ﷰ-�]|[-])(([A-Z]|[a-z]|[À-Ö]|[Ø-ö]|[ø-˿]|[Ͱ-ͽ]|[Ϳ-]|[-]|[⁰-]|[Ⰰ-]|[、-]|[豈-﷏]|[ﷰ-�]|[-]|_|\-|[0-9]|·|[̀-ͯ]|[‿-⁀]|\.)*([A-Z]|[a-z]|[À-Ö]|[Ø-ö]|[ø-˿]|[Ͱ-ͽ]|[Ϳ-]|[-]|[⁰-]|[Ⰰ-]|[、-]|[豈-﷏]|[ﷰ-�]|[-]|_|\-|[0-9]|·|[̀-ͯ]|[‿-⁀] ))?|' of the facet 'pattern' is not a valid regular expression.
WXS schema owl2-xml.xsd failed to compile
但是如果我选择验证器xml文件(这个:http://mowl-power.cs.man.ac.uk:8080/validator/
)
我的XML文件已经过验证!
我不明白为什么,这不起作用......当我选择(应该)的XML Schema与验证器链接相同时。
XML模式来自那里:http://www.w3.org/2009/09/owl2-xml.xsd
(owl2)
验证器也使用owl2结构。
那么......我错过了什么?
示例猫头鹰文件
这是我正在使用并尝试验证camera.owl
的示例答案 0 :(得分:4)
您可以通过多种方式序列化OWL本体。其中之一是将其序列化为RDF。 RDF也可以以多种不同的格式序列化,其中一种格式是RDF / XML。您在线看到的.owl
扩展名的许多文件都是OWL本体的RDF表示的RDF / XML序列化。那里的可能性会有 lot ,因为在RDF / XML序列化中可以通过许多不同的方式序列化相同的RDF图。有关该问题的详情,请参阅my answer至How to access OWL documents using XPath in Java?。
序列化OWL本体的另一种方法是使用OWL / XML序列化,它也是基于XML的,但不是基于RDF的序列化。我假设你从3.4 The XML Schema的OWL 2 Web Ontology Language XML Serialization (Second Edition)获得了你正在使用的XSD文件。该序列化是XML中OWL本体的直接序列化,不采用OWL→RDF→RDF / XML路由。也就是说,XSD用于OWL / XML格式,而不是RDF / XML。
因此,我怀疑无论您的验证器是否正确处理XSD,所发生的事情是您尝试使用XSD for OWL / XML验证RDF / XML文件。您没有显示您尝试验证的OWL文件的任何内容,因此我们无法确定。
作为一个非常简单的例子,这里是OWL / XML序列化中的小型OWL本体,通过Protégé生成。如果使用OWL / XML格式保存本体,这就是您所获得的:
<?xml version="1.0"?>
<!DOCTYPE Ontology [
<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
<!ENTITY xml "http://www.w3.org/XML/1998/namespace" >
<!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
]>
<Ontology xmlns="http://www.w3.org/2002/07/owl#"
xml:base="https://stackoverflow.com/q/23984040/1281433/example"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:xml="http://www.w3.org/XML/1998/namespace"
ontologyIRI="https://stackoverflow.com/q/23984040/1281433/example">
<Prefix name="rdf" IRI="http://www.w3.org/1999/02/22-rdf-syntax-ns#"/>
<Prefix name="rdfs" IRI="http://www.w3.org/2000/01/rdf-schema#"/>
<Prefix name="xsd" IRI="http://www.w3.org/2001/XMLSchema#"/>
<Prefix name="owl" IRI="http://www.w3.org/2002/07/owl#"/>
<Declaration>
<Class IRI="#Person"/>
</Declaration>
<Declaration>
<NamedIndividual IRI="#RichardNixon"/>
</Declaration>
<ClassAssertion>
<Class IRI="#Person"/>
<NamedIndividual IRI="#RichardNixon"/>
</ClassAssertion>
<AnnotationAssertion>
<AnnotationProperty abbreviatedIRI="rdfs:label"/>
<IRI>#RichardNixon</IRI>
<Literal xml:lang="en" datatypeIRI="&rdf;PlainLiteral">Richard Nixon</Literal>
</AnnotationAssertion>
</Ontology>
<!-- Generated by the OWL API (version 3.2.5.1912) http://owlapi.sourceforge.net -->
如果您保存与RDF / XML相同的本体,则可以得到:
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns="https://stackoverflow.com/q/23984040/1281433/example#"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#">
<owl:Ontology rdf:about="https://stackoverflow.com/q/23984040/1281433/example"/>
<owl:Class rdf:about="https://stackoverflow.com/q/23984040/1281433/example#Person"/>
<owl:NamedIndividual rdf:about="https://stackoverflow.com/q/23984040/1281433/example#RichardNixon">
<rdf:type rdf:resource="https://stackoverflow.com/q/23984040/1281433/example#Person"/>
<rdfs:label xml:lang="en">Richard Nixon</rdfs:label>
</owl:NamedIndividual>
</rdf:RDF>
它们都是本体的基于XML的序列化,但它们并不相同,只有OWL / XML表示将由您正在使用的XSD验证。但是,两者都可以使用OWL验证器进行验证,因为它们都是OWL本体的合法序列化。
答案 1 :(得分:2)
mowl-power上的验证程序将文件验证为owl 2本体,而不是XML。我相信,对于它使用的OWLAPI解析器,DTD和xsd解析通常是关闭的。
答案 2 :(得分:1)
xmllint的正则表达式解析器似乎出错了。正如错误消息所表明的那样,它期望分支分隔符|
后跟一些非空分支;但是,XSD规范很清楚空字符串是一个分支。如果要根据此XSD架构验证XML,则需要使用具有更可靠的XSD实现的验证器。
答案 3 :(得分:-1)