使用SimpleXML在PHP中解析嵌套的XML / RDF命名空间元素

时间:2012-04-08 20:24:56

标签: php xml rdf semantic-web semantic-markup

鉴于以下采用from the 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>等删除。

3 个答案:

答案 0 :(得分:3)

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

中的解析器

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

答案 1 :(得分: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数组。

答案 2 :(得分:0)

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

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

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