Как получить дочерние данные XML? - PullRequest
1 голос
/ 12 октября 2010

У меня есть некоторые данные XML в формате ниже -

<xyz:reqResponse 
    xmlns:xyz="http://www.test.com/xyz/" 
    xmlns:akt="http://www.exmple.com/akt/">
  <xyz:version>1.2</xyz:version>
  <xyz:totalRecords>659</xyz:totalRecords>
  <xyz:records>
    <xyz:record>
        <doc>
            <str name="icon_url">http://www.icons.net/icon1.jpg</str>
            <str name="type">Service</str>
            <arr name="bc.recordTitle"><str>Evergreen Club</str></arr>
            <str name="bc.id">KLM0078</str>
            <str name="system.external.id">787678</str>
            <arr name="bc.description">
                <str>Meetings: Church Hall Beaudesert Lane. Open to anyone over 50.</str>
            </arr>
            <str name="code">X1209</str>
            <double name="localval1">-4.00006</double>
            <double name="localval2">-7.00012</double>
            <date name="timestamp">Wed Jun 02 21:19:33 BST 2010</date>
        </doc>
    </xyz:record>
    <xyz:record>
        <doc>
            <str name="icon_url">http://www.icons.net/icon1.jpg</str>
            <str name="type">Service</str>
            <arr name="bc.recordTitle"><str>Evergreen Club</str></arr>
            <str name="bc.id">KLM0078</str>
            <str name="system.external.id">787678</str>
            <arr name="bc.description">
                <str>Meetings: Church Hall Beaudesert Lane. Open to anyone over 50.</str>
            </arr>
            <str name="code">X1209</str>
            <double name="localval1">-4.00006</double>
            <double name="localval2">-7.00012</double>
            <date name="timestamp">Wed Jun 02 21:19:33 BST 2010</date>
        </doc>
    </xyz:record>
  </xyz:records>
</xyz:reqResponse>

Я делаю что-то вроде

$xml = simplexml_load_string($xml_data);            
$namespaces = $xml->getNameSpaces(true);
$data = $xml->children($namespaces['xyz']);

, поэтому, если я печатаю

echo $data->totalRecords;  //outputs correctly 659

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

Я пробовал что-то вроде

$records = $data->records;
foreach($records as $record) {
    echo print_r($record, true);
}

, но это не очень помогло.

Мои вопросы - - как получить доступ к каждому <xyz:record> и его подпунктам (которые <str name="abc">NAbc</str> и т. Д.

С благодарностью, Кей

Ответы [ 2 ]

2 голосов
/ 12 октября 2010

Я бы использовал метод xpath ():

$xml = simplexml_load_string($xml_data);

$xml->registerXPathNamespace('xyz', 'http://www.test.com/xyz/'); 

$recordArr = $xml->xpath('/xyz:reqResponse/xyz:records/xyz:record');

foreach($recordArr as $record) {
    $strArr = $record->xpath('doc/str');

    foreach($strArr as $str) {
        do what you want with $str
    }
}

(непроверенная.)

1 голос
/ 12 октября 2010

Когда вы выбираете $data->records, вы выбираете все records элементы, а не record, я думаю, вы должны использовать $data->records->record, чтобы обозначить все record элементы.

$records = $data->records->record;
foreach($records as $record){
    $doc = $record->doc;
    //Now here you can access all str elements itering through $doc->str elements.
}

ЗдесьПример PHP: SimpleXMLElement

Обновление (Как мы говорим в Италии "Вы никогда не перестанете учиться")

Вы можете получить доступ к элементам xml как объектамтолько если они совместно используют одно и то же пространство имен, вы можете сделать это:

$docsCollection = $record->children(); //This will retrieve children within default namespace
$strCollection = $docs->doc->str; //Now we are in the same namespace and can reuse above notation

Только для записи.

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