2017-02-02 25 views
0

XMLと関連するPHPを使って、以下のように名前空間の値を取得する方法と同じ方法で名前空間の値を取得する方法はありますか?私はこれについて多くの他のSEのQAsを参照してきましたが、それを正しくするようには見えません。助けに感謝します。 :)名前空間と非名前空間XMLを混在させて値を取得する方法

<?xml version="1.0" encoding="UTF-8"?> 
<rss version="2.0" xmlns:psg="http://b3000.example.net:3000/psg_namespace/"> 
    <channel> 
    <title>Example</title> 
    <description>example stuff</description> 
    <item> 
     <psg:eventId>406589</psg:eventId> 
     <psg:duration>3482</psg:duration> 
    </item> 
    </channel> 
</rss> 

$xml = new SimpleXMLElement($source, null, true); 
foreach($xml->channel->item as $entry){ 
    echo $entry->title;   // This works 
    echo $entry->description; // This works 
    echo $entry->item->duration // Pseudo of what I need 
} 

期間の取得方法は?それは私が実際に探していた答えではありませんでしたが、このようなバリエーションを持つ私の試みは更新

$namespaces = $item->getNameSpaces(true); 
$psg = $item->children($namespaces['psg']); 

を失敗している、私は私につながる事をしようとしてしまった最初の答えを受け入れなければなりません実際の問題 - "オペレータエラー"!これは動作します....私の問題はそれを理解しようとしていた、私はecho print_r($psg, true)でデバッグしていた。それは結果をSimpleXmlObjectとして表示していましたが、そのプロパティを取得する方法を追いかけていました。私がしなければならなかったことは、それをエコーする代わりにプロパティを割り当てることでした。

これを達成する1つの方法はXPath with namespacesの組み合わせを使用することです
foreach($xml->channel->item as $entry){ 
    $psg = $item->children($ns['psg']); 
    $title = (string) $item->title; 
    $duration = (string) $psg->duration; 
} 
+0

あなたがに、あなたが名前空間を渡すと、それは接頭辞だということを教えどこhttp://php.net/manual/en/simplexmlelement.children.phpからメソッド 'children'を使用してみましたそのノードに行きますか? – Andy

+0

こんにちは!このサイトの規約は、質疑応答が別々のままであることです。たとえそれがあなたの質問に答えることを意味していても(http://stackoverflow.com/help/self-answer)。したがって、あなたが追加した「更新」は本当に答えになるはずです。これを受け入れることで、将来の読者にあなたの問題を解決したことを示すことができます。あなたはRobbie Averillの答えをアップヴォートして、それが有用であることを示すことができます。 – IMSoP

答えて

0

:あなたは文字通りの名前空間を宣言したくない場合は

$xml = new SimpleXMLElement($source, null, true); 
$xml->registerXPathNamespace('psg', 'http://b3000.example.net:3000/psg_namespace/'); 

foreach ($xml->xpath('//item/psg:duration') as $duration) { 
    echo $duration, PHP_EOL; 
} 

、あなたは文書からそれを取得し、それを追加することができます/動的に:

foreach ($xml->getDocNamespaces() as $key => $namespace) { 
    $xml->registerXPathNamespace($key, $namespace); 
} 
関連する問題