【问题标题】:Parsing nested XML/RDF namespace elements in PHP with SimpleXML使用 SimpleXML 解析 PHP 中嵌套的 XML/RDF 命名空间元素
【发布时间】:2012-04-08 20:24:56
【问题描述】:

鉴于下面采用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#" 并且从 &lt;cd:artist&gt; 中删除“cd”命名空间等,是否有必要做任何不同的事情。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 这个。使用现成的 RDF/XML 解析器(如 arc2)还有一个优点,即您可以使用相同的 API 解析其他 RDF 语法(如 TurtleRDFa),而对代码的更改最少或无需更改。
    • 很好的答案,但目前我对此的需求很小,所以简单更重要。不过,将来会牢记arc2。谢谢!
    • Bendihossan,如果您想要简单,为什么要在图片中引入 XML API?使用正则表达式可以轻松解决您的情况。当您在图片中引入 XML 工具时,您会使其变得像使用原生 RDF 工具一样复杂,不同之处在于您的 XML 工具将无法处理更复杂的情况。
    • Antoine:我是 RDF 新手,我还在学习 RDF 和本体。出于这个原因,我从一开始就让事情变得简单,直到我更加理解它并且我可以以更有意义的方式使用它。
    【解决方案2】:

    您可以使用 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 数组。

    【讨论】:

    • 如果我解析 Bendihossan 的 RDF/XML 文档并将其序列化回 RDF/XML,我可能会获得不同的 XML 结构,例如:&lt;rdf:Description rdf:about="http://www.recshop.fake/cd/Empire Burlesque" cd:artist="Bob Dylan" cd:country="USA" cd:company="Columbia" cd:price="10.90" cd:year="1985"/&gt; 相同的 XPath 查询不起作用,但 RDF 图完全一样。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 2016-09-22
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      相关资源
      最近更新 更多