2017-02-02 12 views
0

Учитывая XML и связанные с ним PHP, ниже, как я могу получить значения, размещенные в именах, таким же образом, что я могу получить значения, не содержащие имен? Я имею в виду несколько других SE QA об этом, но не может показаться, что это правильно. Помощь приветствуется.)Как получить значения из смешанного пространства имен и пространства имен без пространства имен с помощью

<?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']); 

Update

Хотя это не ответ, который я был на самом деле искал, я должен принять первый ответ, который получил меня пытаются все ведущие к фактическая проблема - «ошибка оператора»! Это работает ... моя проблема заключалась в том, чтобы разобраться в этом, я отлаживал echo print_r($psg, true). Это показало результат как SimpleXmlObject, который затем заставил меня преследовать, как получить эти свойства. Все, что мне нужно было сделать, - это присвоить свойство, а не эхом.

foreach($xml->channel->item as $entry){ 
    $psg = $item->children($ns['psg']); 
    $title = (string) $item->title; 
    $duration = (string) $psg->duration; 
} 
+0

вы пробовали использовать метод 'children' из http://php.net/manual/en/simplexmlelement.children.php где вы передаете в пространстве имен и сказать ему, что это префикс, чтобы попасть в этот узел? – Andy

+0

Привет! Соглашение этого сайта заключается в том, что вопросы и ответы остаются отдельными [даже если это означает ответ на ваш собственный вопрос] (http://stackoverflow.com/help/self-answer). Таким образом, добавление «Обновление», которое вы добавили, должно быть действительно ответом, который затем можно принять, чтобы показать будущим читателям, что это то, что решило вашу проблему. Вы можете поддержать ответ Робби Аверилла, чтобы показать, что это было полезно. – IMSoP

ответ

0

Одним из способов достижения этой цели является использование комбинации XPath with namespaces:

$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); 
} 
Смежные вопросы