2

W3C Web サイトから取得した以下の 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 では、「cd」名前空間が削除されたなどと宣言する代わりに、別のことを行う必要がxmlns:cd="http://www.recshop.fake/cd#"あります。xmlns="http://www.recshop.fake/cd#"<cd:artist>

4

3 に答える 3

3

XML パーサーは RDF トリプルを XML に書き込むエンコーディングを理解しないため、rdf/xml を読み取るために XML パーサーを使用しないでください。のような用語の 1 つを書き留める方法は複数あります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

dc価値があるのは、ファイルがどのようにフォーマットされていても、名前空間のプロパティを提供できるSPARQLクエリです(ファイルがあなたの例とまったく同じようにフォーマットされている場合にのみ機能するTamas ImreiのXPathクエリとは対照的です):

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

これは、使用する名前空間プレフィックスにも依存しません。

于 2012-04-12T08:04:00.403 に答える