0

我正在尝试使用 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 模式(应该)与验证器链接相同时。

XML 模式来自那里:http://www.w3.org/2009/09/owl2-xml.xsd(owl2) 验证器也使用 owl2 结构。所以......我错过了什么?

示例猫头鹰文件

这是我正在使用并尝试验证camera.owl的示例

4

4 回答 4

4

有多种方法可以序列化 OWL 本体。其中之一是将其序列化为 RDF。RDF 也可以以多种不同的格式进行序列化,其中一种是 RDF/XML。您在网上看到的许多带有.owl扩展名的文件都是 OWL 本体的 RDF 表示的 RDF/XML 序列化。那里的可能性会有很多变化,因为同一个 RDF 图可以在 RDF/XML 序列化中以许多不同的方式进行序列化。请参阅我对如何在 Java 中使用 XPath 访问 OWL 文档的回答?有关该问题的更多信息。

序列化 OWL 本体的另一种方法是使用 OWL/XML 序列化,它也是基于 XML 的,但不是基于 RDF 的序列化。我假设您从3.4 The XML Schema from OWL 2 Web Ontology Language XML Serialization (Second Edition)中获得了您正在使用的 XSD 文件。该序列化是 XML 中 OWL 本体的直接序列化,不采用 OWL → RDF → RDF/XML 路线。也就是说,XSD 是针对 OWL/XML 格式的,而不是针对 RDF/XML 的。

因此,我怀疑无论您的验证器是否正确处理 XSD,正在发生的事情是您正在尝试使用用于 OWL/XML 的 XSD 来验证 RDF/XML 文件。您没有显示您尝试验证的 OWL 文件的任何内容,因此我们无法确定。

作为一个非常简单的例子,这里有一个通过 Protégé 生成的 OWL/XML 序列化中的小型 OWL 本体。如果您使用 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 本体的合法序列化。

于 2014-06-02T12:31:54.607 回答
2

mowl-power 上的验证器将文件验证为 owl 2 本体,而不是 XML。我相信,它使用的 OWLAPI 解析器通常会关闭 DTD 和 xsd 解析。

于 2014-06-02T08:28:22.917 回答
1

xmllint 的正则表达式解析器似乎出错了。正如错误消息所表明的那样,预计分支分隔符|后面将跟随一些非空分支;然而,XSD 规范清楚地表明空字符串算作一个分支。如果要针对此 XSD 模式验证 XML,则需要使用具有更可靠的 XSD 实现的验证器。

于 2014-06-01T22:01:55.443 回答
-1

您可以在代码之前使用http://pythonhosted.org/Owlready/来读取和解析 owl 文件

于 2017-06-24T04:11:43.507 回答