鉴于以下采用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>
等删除。
答案 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#"))
}
这也与您使用的名称空间前缀无关。