Выберите целевой узел xml с помощью атрибута, а затем верните значение другого атрибута с помощью simpleXML - PullRequest
2 голосов
/ 06 августа 2011

У меня есть xml:

<release id="2276808" status="Accepted">
    <images>
         <image height="600" type="primary" uri="http://s.dsimg.com/image/R-2276808-1302966902.jpeg" uri150="http://s.dsimg.com/image/R-150-2276808-1302966902.jpeg" width="600"/>                       
         <image height="600" type="secondary" uri="http://s.dsimg.com/image/R-2276808-1302966912.jpeg" uri150="http://s.dsimg.com/image/R-150-2276808-1302966912.jpeg" width="600"/>  
         <image height="600" type="secondary" uri="http://s.dsimg.com/image/R-2276808-1302966919.jpeg" uri150="http://s.dsimg.com/image/R-150-2276808-1302966919.jpeg" width="600"/><image height="600" type="secondary" uri="http://s.dsimg.com/image/R-2276808-1302966929.jpeg" uri150="http://s.dsimg.com/image/R-150-2276808-1302966929.jpeg" width="600"/>
    </images> ...

Я использую SimpleXML и php 5.3.

Я хочу нацелиться на узел image, где type="primary" и вернуть значение дляатрибут uri.

Ближайшее, что я получил, это:

$xml->xpath('/release/images/image[@type="primary"]')->attributes()->uri;

, что не удается, потому что вы не можете вызвать attribute() метод после xpath.

Ответы [ 4 ]

2 голосов
/ 13 августа 2011

Я хочу нацелить узел изображения, где type="primary "и вернуть значение для атрибута uri.

Использовать это однострочное выражение XPath :

/*/images/image[@type="primary"]/@uri

Выбирает атрибут с именем uri элемента image, строковое значение атрибута которого type равно "primary", и это дочерний элемент элемента images`это дочерний элемент верхнего элемента в документе XML.

Чтобы получить только значение атрибута, используйте это выражение XPath :

string(/*/images/image[@type="primary"]/@uri)

Примечание : Это чисто XPath-решение, которое можно использовать с любым движком, совместимым с W3C XPath.

2 голосов
/ 08 августа 2011

Чистое выражение XPath 1.0 для достижения атрибутов:

"/release/images/image[@type="primary"]/@uri" 

Может быть, вам нужно исправить только XPath.

0 голосов
/ 12 августа 2011

Хотя я большой поклонник встроенного DOMDocument, в отличие от SimpleXML, и поэтому не все, что знакомы с SimpleXML ...

Я полагаю $xml->xpath('/release/images/image[@type="primary"]') Должен дать вам список узлов,ни одного узла.

В вашем случае я бы ожидал, что возможное решение будет таким же простым, как

$nodes = $xml->xpath('/release/images/image[@type="primary"]'); // get matching nodes
$node = reset($nodes); // get first item
$uri = $node->attributes()->uri;

Поскольку вы специально упомянули использование SimpleXML, я бы посоветовал вам поискатьв результате вашего звонка на $xml->path(...) Но для полноты, вот как я бы это сделал, используя DOMDocument и DOMXPath (который будет работать, гарантировано, протестировано и все):

$doc = new DOMDocument('1.0', 'utf8');
$doc->loadXML($yourXMLString);

$xpath = new DOMXPath($doc);
$nodes = $xpath->query('/release/images/image[@type="primary"]');

$theNodeYouWant = $nodes->item(0); // the first node matching the query
$uri = $theNodeYouWant->getAttribute('uri');

Это кажетсянемного более многословно, но это в основном потому, что я включил инициализацию для этого.

0 голосов
/ 08 августа 2011

Как насчет этого:

$xml = new SimpleXMLElement(file_get_contents('feed.xml'));
$theUriArray = $xml->xpath('/release/images/image[@type="primary"]');
$theUri = $theUriArray[0]->attributes()->uri;

echo($theUri);
...