Запрос XPath, возвращающий «false» в SimpleXML - PullRequest
2 голосов
/ 07 апреля 2010

У меня есть фрагмент XML как таковой:

<meta_tree type="root">
    <meta_data>
        <meta_cat>Content Provider</meta_cat>
        <data>Mammoth</data>
    </meta_data>
    <meta_data>
        <meta_cat>Genre</meta_cat>
        <data>Games</data>
    </meta_data>
    <meta_data>
        <meta_cat>Channel Name</meta_cat>
        <data>Games Trailers</data>
    </meta_data>
    <meta_data>
        <meta_cat>Collection</meta_cat>
        <data>Strategy</data>
    </meta_data>
    <meta_data>
        <meta_cat>Custom 1</meta_cat>
        <data>PC</data>
    </meta_data>
    <meta_data>
        <meta_cat>DRM Protected</meta_cat>
        <data>N</data>
    </meta_data>
    <meta_data>
        <meta_cat>Aspect Ratio</meta_cat>
        <data>16:9</data>
    </meta_data>
    <meta_data>
        <meta_cat>Streaming Type</meta_cat> 
        <data>VOD</data>
    </meta_data>
</meta_tree>

, который я получил из фрагмента $meta_tree->asXML().

Итак, мне нужно иметь запрос xpath для каждого элемента, поэтому я использую:

$meta_tree->xpath("/meta_data[meta_cat='Content Provider']");

но это возвращает ложь.

Я пытался:

  • /meta_tree/meta_data[meta_cat='Content Provider']
  • //meta_data[meta_cat='Content Provider']
  • meta_data[meta_cat='Content Provider'] (возвращает массив, но массив пуст)

Я использовал AquaPath , который проверяет мой запрос, поэтому я не уверен, что делаю неправильно.

У кого-нибудь есть идеи?

DJS.

РЕДАКТИРОВАТЬ: Согласно предложению Tolomak, вот еще немного информации.

Элемент представляет собой фрагмент большего документа, как показано ниже (имена были заменены на *** для защиты невинных):

<contents total_items="1" xmlns="http://rxml.***.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://rxml.***.com/xsd/*Ingestion.xsd ">
     <content item_id="451195">
         ...
         <meta_tree type="root">
             ... see snippet above ...
         </meta_tree>
    </content>
</contents>

Я получаю фрагмент выше по:

$dom = new SimpleXMLElement(... xml_string ... );
foreach($dom->content as $content)
{
    $contentMetadata = $this->getMetadata($content->meta_tree)
}

public function getMetadata($meta_tree)
{
    echo $meta_tree->asXML();
}

ОТВЕТ: проблема в пространстве имен по умолчанию. Я решил удалить их, а не работать с пространством имен, если только кто-нибудь не знает, как зарегистрировать пространство имен по умолчанию xmlns в SimpleXMLElement.

Ответы [ 2 ]

0 голосов
/ 11 января 2013

Проблемой было пространство имен по умолчанию.Я решил удалить их, а не работать с пространством имен, если только кто-нибудь не знает, как зарегистрировать пространство имен xmlns по умолчанию в SimpleXMLElement.

0 голосов
/ 07 апреля 2010

попробуй

$meta_tree->xpath("meta_data[meta_cat='Content Provider']")

например

<?php
$meta_tree = new SimpleXMLElement(getData());
$foo = $meta_tree->xpath("meta_data[meta_cat='Content Provider']");
var_dump($foo);

function getData() {
  return '<meta_tree type="root">
    <meta_data>
        <meta_cat>Content Provider</meta_cat>
        <data>Mammoth</data>
    </meta_data>
    <meta_data>
        <meta_cat>Genre</meta_cat>
        <data>Games</data>
    </meta_data>
    <meta_data>
        <meta_cat>Channel Name</meta_cat>
        <data>Games Trailers</data>
    </meta_data>
    <meta_data>
        <meta_cat>Collection</meta_cat>
        <data>Strategy</data>
    </meta_data>
    <meta_data>
        <meta_cat>Custom 1</meta_cat>
        <data>PC</data>
    </meta_data>
    <meta_data>
        <meta_cat>DRM Protected</meta_cat>
        <data>N</data>
    </meta_data>
    <meta_data>
        <meta_cat>Aspect Ratio</meta_cat>
        <data>16:9</data>
    </meta_data>
    <meta_data>
        <meta_cat>Streaming Type</meta_cat> 
        <data>VOD</data>
    </meta_data>
  </meta_tree>';
}

печать

array(1) {
  [0]=>
  object(SimpleXMLElement)#2 (2) {
    ["meta_cat"]=>
    string(16) "Content Provider"
    ["data"]=>
    string(7) "Mammoth"
  }
}
...