XPath sorgusu SimpleXMLElement 'false' dönen

2 Cevap php

Ben gibi bir xml parçası var:

<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>

Ben parçacığını topladı ki $meta_tree->asXML().

Yani verilen, ben her eleman için bir XPath sorgusu olması gerekir, bu yüzden ben kullanıyorum:

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

ama bu yanlış döndürür.

Ben denedim:

  • /meta_tree/meta_data[meta_cat='Content Provider']
  • //meta_data[meta_cat='Content Provider']
  • meta_data[meta_cat='Content Provider'] (bu bir dizi döndürür, ancak dizi boştur)

Ben sorguyu doğrular ki, AquaPath kullanarak oldum, ben yanlış yapıyorum emin değilim.

Herkes herhangi bir fikir var mı?

DJS.

EDIT: Tolomak önerisine göre, burada biraz daha fazla bilgi var.

Aşağıdaki gibi elemanın (isimleri ile değiştirilmiştir * masum korumak için), daha büyük bir dokümanın bir parçası olduğu:

<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>

Ben yukarıda fragmanı almak:

$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();
}

ANSWER: sorun varsayılan ad oldu. Herkes SimpleXMLElement xmlns varsayılan ad kaydetmek için nasıl bilir sürece, yerine ad ile anlaşma daha onları dışarı atmak için seçtiniz.

2 Cevap

Sorun varsayılan ad oldu. Herkes SimpleXMLElement xmlns varsayılan ad kaydetmek için nasıl bilir sürece, yerine ad ile anlaşma daha onları dışarı atmak için seçtiniz.

denemek

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

örneğin

<?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>';
}

baskılar

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