Разбор атрибута xml в зависимости от дочернего содержимого - PullRequest
0 голосов
/ 31 декабря 2010

Я загружаю внешний XML-файл, содержащий пользовательские метасы, которые выглядят так:

<?xml version="1.0" encoding="utf-8"?>
<user_information>
<user url="http://usersweb.com">
<name>Arnold</name>
<lastname>
<name>Arnoldson</name>
</lastname>
<age>42</age>
</user>
<user url="http://anotheruserweb.com">
<name>Arnold</name>
<lastname>
<name>Arichson</name>
</lastname>
<age>42</age>
</user>
And so on....
</user_information>

Я знаю, что форматирование с помощью

<lastname> 

действительно глупо, но я не могу изменитьsource.

Я хочу загрузить в атрибут "url" из

<user>

, но только если

<name> 

и

<lastname> 

соответствует значениям имен, которые я сохранил в своей собственной базе данных пользователей.

Я знаю, как проанализировать остальную часть этого с помощью PHP, но мне просто сложно найти подходящую последовательность.Любая помощь приветствуется!


РЕДАКТИРОВАТЬ: Поскольку я не могу дать вам исходный XML, я нашел похожую структуру кода в API метаданных Spotify.Мы можем работать с возвращаемым XML-файлом из трека поиска «Domino Dancing»: ws.spotify.com / search / 1 / track? Q = Domino Dancing

Он имеет точнота же структура, за исключением того, что используются другие слова.Возвращаемый файл выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?> 
<tracks xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" xmlns="http://www.spotify.com/ns/music/1"> 
<opensearch:Query role="request" startPage="1" searchTerms="Domino Dancing"/> 
<opensearch:totalResults>39</opensearch:totalResults> 
<opensearch:startIndex>0</opensearch:startIndex> 
<opensearch:itemsPerPage>100</opensearch:itemsPerPage> 
<track href="spotify:track:2aV5vCNH5tOOe0GGKqfx5Z"> 
<name>Domino dancing</name> 
<artist href="spotify:artist:2ycnb8Er79LoH2AsR5ldjh"> 
<name>Pet Shop Boys</name> 
</artist> 
<id type="isrc">GBAYE0301704</id> 
<album href="spotify:album:0BAfuhzkGjckMhsL2gVbzR"> 
<name>Ultimate</name> 
<released>2010</released> 
<availability> 
<territories>AT BE CH CY CZ DE DK EE ES FI FR GB GR HR HU IE IT LT LU NL NO PL PT RO SE SI SK</territories> 
</availability> 
</album> 
<track-number>7</track-number> 
<length>258.106000</length> 
<popularity>0.57092</popularity> 
</track> 
<track href="spotify:track:4mVLzFbc3gaCoWCEENLouc"> 
<name>Domino Dancing</name> 
<artist href="spotify:artist:2ycnb8Er79LoH2AsR5ldjh"> 
<name>Pet Shop Boys</name> 
</artist> 
<id type="isrc">GBAYE8800056</id> 
<album href="spotify:album:0Jt2LzWgtGxy3GZH5i2Kcy"> 
<name>Discography - Complete Singles Collection</name> 
<released>1991</released> 
<availability> 
<territories>AT BE CH CY CZ DE DK EE ES FI FR GB GR HR HU IE IT LT LU NL NO PL PT RO SE SI SK</territories> 
</availability> 
</album> 
<track-number>10</track-number> 
<length>258.333000</length> 
<popularity>0.56159</popularity> 
</track> 
<track href="spotify:track:72kgJ1brMxxeDiPNdH6qqW"> 
<name>Viva la vida/Domino dancing</name> 
<artist href="spotify:artist:2ycnb8Er79LoH2AsR5ldjh"> 
<name>Pet Shop Boys</name> 
</artist> 
<id type="isrc">GBCEW0900049</id> 
<album href="spotify:album:4DZfMTDyBwnJQ0k1PaT6U4"> 
<name>Pet Shop Boys Christmas</name> 
<released>2009</released> 
<availability> 
<territories>AT BE CH CY CZ DE DK EE ES FI FR GB GR HR HU IE IT LT LU NL NO PL PT RO SE SI SK</territories> 
</availability> 
</album> 
<track-number>4</track-number> 
<length>333.507000</length> 
<popularity>0.51961</popularity> 
</track>
</tracks>

Если мы представим, что user_information = track user = track url = href lastname = artist.

Надеюсь, это поможет!

EDIT2: Я решил это с помощью Xpath Document и пространств имен.Спасибо всем за попытку!

Ответы [ 2 ]

1 голос
/ 31 декабря 2010

Этот XPATH выбирает @url для Арнольда Арчисона:

/user_information/user[name='Arnold' and lastname/name='Arichson']/@url

РЕДАКТИРОВАТЬ

Два вопроса о вашем решении: 1.Могу ли я использовать xpath с simplexml_load_file вместо simplexmlelement?2. Могу ли я заменить значения Арнольда Ариксона на переменные типа $ users_firstname и $ users_lastname =

Я не парень по PHP, но я считаю, что вы должны быть в состоянии сделать что-то подобное (вам может потребоваться объединить строку XPATH по-другому, или вам может не потребоваться экранировать одинарные кавычки, не уверен):

<?php

$first = "Arnold";
$last = "Arichson";

$userInfo =  simplexml_load_file('http://your.website.com/user_information.xml');

foreach ($userInfo->xpath("/user_information/user[name=\'$first\' and lastname/name=\'$last\']/@url") as $url) {
  echo "<h2>" . $url . "</h2>";
}
?>
0 голосов
/ 31 декабря 2010
$xml = new SimpleXMLElement($xml_string);
foreach ($xml->user as $value) {
   if ($value->name == $x && $value->lastname->name == $y) {
      $attr = $value->attributes();
      echo $attr['url'];
   }
}

Это загрузит строку xml в простой объект xml, затем сравнит значения узлов и, если они соответствуют вашему желаемому имени ($x и $y), напечатает URL-адрес.Вы также можете загрузить XML-файл вместо строки, чтобы создать объект simplexml, если это необходимо.см. simplexml документацию для получения дополнительной информации.

ДОПОЛНЕНИЕ

Использование строки (проверено и работает):

<?php
    $xml_input = <<<XML
<user_information> <user url="http://usersweb.com"> <name>Arnold</name> <lastname> <name>Arnoldson</name> </lastname> <age>42</age> </user> <user url="http://anotheruserweb.com"> <name>Arnold</name> <lastname> <name>Arichson</name> </lastname> <age>42</age> </user></user_information>
XML;

$xml = new SimpleXMLElement($xml_input); 
foreach ($xml->user as $value) {
    if ($value->name == 'Arnold' && $value->lastname->name == 'Arnoldson') {
        $attr = $value->attributes();
        echo $attr['url'];
    }
} 
?>

Использование файла (должно работать точно так же):

<?php
    $xml = new SimpleXMLElement($xml_file_path, 0, true); 
    foreach ($xml->user as $value) {
        if ($value->name == 'Arnold' && $value->lastname->name == 'Arnoldson') {
            $attr = $value->attributes();
            echo $attr['url'];
        }
    } 
?>

В конструкции объекта я добавил аргументы 0 и true, что позволяет использовать путь к файлу для первого аргумента вместо строки.Но да, вы также можете использовать функцию загрузки файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...