2013-05-31 3 views
1

Существует много информации о SO и PHP.net об использовании PHP для работы с XML, но у меня возникают проблемы с поиском всего, что показывает, как работать с пространством имен в так же, как мой XML настроен. Я вообще не знаком с XML, так что вполне возможно, что я просто не знаю, что именно ищу, когда пытаюсь сделать это.Использование PHP для анализа XML с помощью SimpleXML и проблем с пространствами имен

Это то, что он выглядит следующим образом:

<entry> 
    <id>16</id> 
    <link href="/ws/1/h/all/16/" type="application/vnd.m.h+xml" title="m_h_title" /> 
    <published>2013-05-11T20:53:31.144957Z</published> 
    <updated>2013-05-27T12:20:13.963730Z</updated> 
    <author> 
     <name>Discovery</name> 
    </author> 
    <title>m_h_title</title> 
    <summary> 
     A presentation of the substance of a body of material in a condensed form or by reducing it to its main points; an abstract. 
    </summary> 
    <myns:fields> 
     <myns:field name="field_one" type="xs:string" value="value_one" /> 
     <myns:field name="field_two" type="xs:string" value="value_two" /> 
     <myns:field name="field_three" type="xs:string" value="value_three" /> 
     <myns:field name="field_four" type="xs:string" value="value_four" /> 
     <myns:field name="field_five" type="xs:string" value="value_five" /> 
    </myns:fields> 
</entry> 

И это, насколько я сделал это ... (это было немного упрощен, прежде чем я разместил его)

$output = new SimpleXmlElement($response['data']); 

foreach ($output->entry as $entry) 
{ 
    $arr['id'] = (string) $entry->id;   // this is fine 

    $arr['summary'] = trim($entry->summary);  // this is also fine 

    print "\$entry->fields type: " . gettype($entry->fields); // object 


    foreach ($entry->fields as $field) // this doesn't do anything, though 
    { 
     $name = (string) $field['name']; 
     $value = (string) $field['value']; 

     print "$name: $value <br/>"; 

     $arr[$name] = $value; 
    } 
} 

Если я var_dump $ arr, он содержит правильные значения для идентификатора и сводки, но я не могу найти ни одной из данных в реальных полях. Я собираюсь продолжать играть с этим ... так что, если никто не ответит ни на минуту, я могу закончить обновление этого сообщения миллион раз с добавлением кода «это то, что я пробовал».


закончили с этим:

$output = new SimpleXmlElement($xml_response); 

foreach ($output->entry as $entry) 
{  
    $arr['id'] = (string) $entry->id; 
    $arr['summary'] = trim($entry->summary); 

    foreach($entry->children('myns', true) as $fields)  // myns:fields 
    {  
     foreach ($fields->children('myns',true) as $field) // myns:field 
     { 
      $name = (string) $field->attributes()->name; 
      $value = (string) $field->attributes()->value; 

      $arr[$name] = $value;  
     } 
    } 
    } 

ответ

0

Вы должны учитывать пространство имен, там не хватает информации здесь, чтобы предоставить рабочий пример для вас - но посмотрите на комментарий # 2 - SimpleXMLElement::children.

На самом деле, вот краткий пример.

<?php 
$xml = '<items xmlns:my="http://example.org/"> 
    <my:item>Foo</my:item> 
    <my:item>Bar</my:item> 
    <item>Bish</item> 
    <item>Bosh</item> 
</items>'; 

$sxe = new SimpleXMLElement($xml); 

foreach($sxe->item as $item) { 
    printf("%s\n", $item); 
} 

/* 
    Bish 
    Bosh 
*/ 

foreach($sxe->children('my', true) as $item) { 
    printf("%s\n", $item); 
} 

/* 
    Foo 
    Bar 
*/ 

Anthony.

+0

Я не могу заставить его работать - можете ли вы его переключить так, чтобы поля с пространством имен находились под/в поле без пространства имен? например ' foo бар' –