5

我尝试使用 W3C RDF Validator 在线验证一个非常简单的手动编写的 RDF。令我惊讶的是,它正确地解析了来自 rdf 命名空间的 URI,但不是来自不同的命名空间(也来自 W3C)。为什么会这样?

让我们举个例子

<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:org="http://www.w3.org/ns/org#" >
  <rdf:Description rdf:about="https://stackexchange.com/">
    <rdf:type rdf:resource="org:Organization"/>
  </rdf:Description>
</rdf:RDF>

这验证并被解析为 解析结果

如您所见,谓词 (rdf:type) 得到了很好的扩展,可以单击它。对象 (org:Organization) 根本没有展开,而且当我尝试单击链接时,它实际上会向浏览器发送“org:Organization”,从而产生错误。但是命名空间 org 的定义就像 rdf 命名空间一样,如果我手动访问http://www.w3.org/ns/org#Organization,我会得到一个 Turtle 文档。

所以,我的问题是:为什么不在对象中放置http://www.w3.org/ns/org#Organization?我应该改变什么让解析器正确地做到这一点?

4

1 回答 1

5

实际上,解析器做得很好。问题是您试图在属性值(属性的值rdf:resource)内使用 XML 命名空间前缀,而不是作为实际 XML 元素/属性名称本身的限定符(例如rdf:type,这是一个 XML 元素名称) .

换句话说:您不能在字符串值中使用 XML 命名空间。因此,解析器不会尝试“扩展”命名空间,而只是将文字字符串值解析为 URI,并且由于org:Organization实际上是语法上合法的 URI,因此它会生成它。

要获得所需的输出,您必须写出完整的 IRI 字符串,如下所示:

<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:org="http://www.w3.org/ns/org#" >
  <rdf:Description rdf:about="https://stackexchange.com/">
    <rdf:type rdf:resource="http://www.w3.org/ns/org#Organization"/>
  </rdf:Description>
</rdf:RDF>

或者,如果您愿意,可以使用缩写的 RDF/XML 语法来获得:

<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:org="http://www.w3.org/ns/org#" >
  <org:Organization rdf:about="https://stackexchange.com/" />
</rdf:RDF>

顺便说一句:RDF/XML 是一种众所周知的难以使用的语法。RDF 还有其他更简单的语法格式,例如Turtle。只是在说'。

于 2020-07-30T07:22:32.520 回答