2

鉴于下面从 W3C网站获取的 XML/RDF 示例,我如何访问“cd”命名空间中的值?

<?xml version="1.0"?>

<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cd="http://www.recshop.fake/cd#">

<rdf:Description
rdf:about="http://www.recshop.fake/cd/Empire Burlesque">
  <cd:artist>Bob Dylan</cd:artist>
  <cd:country>USA</cd:country>
  <cd:company>Columbia</cd:company>
  <cd:price>10.90</cd:price>
  <cd:year>1985</cd:year>
</rdf:Description>

</rdf:RDF> 

我尝试过执行以下操作:

$XML = new SimpleXMLElement($rawXML); // Assume $rawXML is the quoted XML/RDF above
foreach($xml as $entry){
    $cd = $entry->children('http://www.recshop.fake/cd#');
    echo $cd->artist;
    echo $cd->$country;
    ...
}

我也尝试过:

$XML = new SimpleXMLElement($rawXML); // Assume $rawXML is the quoted XML/RDF above
foreach($xml as $entry){
    $cd = $entry->children('http://www.recshop.fake/cd#');
    $rdf = $entry->children('http://www.w3.org/1999/02/22-rdf-syntax-ns#');
    echo $rdf->$cd->artist;
    echo $rdf->$cd->$country;
    ...
}

此外,在 PHP 中是否有必要做任何不同的事情,而不是声明xmlns:cd="http://www.recshop.fake/cd#"它是xmlns="http://www.recshop.fake/cd#"并且“cd”命名空间已从<cd:artist>等中删除。

4

3 回答 3

3

您不应该使用 XML 解析器来读取 rdf/xml,因为它不理解将 RDF 三元组写入 XML 的编码;有多种方法可以写下其中一个术语,例如cd:artist. 这就像在 JSON 数据上使用正则表达式一样——它可能会起作用,但它不会捕获所有情况。使用 XML 方法,您最终会产生误解。我建议您使用来自https://github.com/semsol/arc2的解析器

XML 方法可行的唯一方法是保证生成的 XML 始终使用相同的模板编写。例如,XMP 文档元数据就是这种情况。

于 2012-04-09T04:22:33.073 回答
1

您可以使用 xpath,首先您需要注册命名空间。试试这个:

$xml = new SimpleXMLElement($rawXML);

$xml->registerXPathNamespace('rdf', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#');
$xml->registerXPathNamespace('cd', 'http://www.recshop.fake/cd#');

$cd = $simple->xpath('rdf:Description/cd:*');

$cd 将是一个 SimpleXMLElements 数组。

于 2012-04-09T00:50:10.203 回答
0

值得一提的是,这里有一个 SPARQL 查询,它可以为您提供dc命名空间中的属性,无论文件格式如何(与 Tamas Imrei 的 XPath 查询相反,该查询仅在文件格式与您的示例完全相同时才有效):

SELECT ?terms WHERE {
   ?s  ?terms  ?o .
   FILTER (regex(str(?term),"http://www.recshop.fake/cd#"))
}

这也与您使用的命名空间前缀无关。

于 2012-04-12T08:04:00.403 回答