Получение значений XML из элементов пространства имен с помощью PHP

Пожалуйста, кто-нибудь может объяснить, как пройти через теги <entry> в этом xml, чтобы echo все элементы с префиксом d:

Ниже работает, поэтому я нахожусь на правильном пути:

 $url = "http://www.treasury.gov/resource-center/data-chart-center/interest-rates/pages/XmlView.aspx?data=yieldyear&year=2015"; $xml = simplexml_load_file($url); foreach( $xml->entry as $entry ) { $element = $xml->entry->children(); foreach( $element as $name=>$x ) { echo $name, '=', $x, "\n"; } } 

Но я борюсь с элементом <content> .

Когда я обновляю $element to = $xml->entry->content->children(); , он не работает.

Пожалуйста, может кто-нибудь помочь мне отладить это?

Вы смотрите на это неправильно. Фактическое пространство имен ( http://schemas.microsoft.com/ado/2007/08/dataservices ) – это то, что вы знаете. Префикс специфичен для элемента и его потомков – до тех пор, пока он не будет переопределен. Он также необязателен для узлов элементов. Следующие элементы дерева имеют одинаковое пространство имен:

  • <f:foo xmlns:f="urn:foo"/>
  • <bar:foo xmlns:bar="urn:foo"/>
  • <foo xmlns="urn:foo"/>

Каждый из элементов разрешается узлу с именем foo внутри пространства имен urn:foo . Вы можете прочитать это как {urn:foo}foo .

Если вы проверяете документацию для методов, здесь много аргументов, которые имеют фактическое пространство имен, поэтому вам не нужно знать префикс. Для XPath вы регистрируете свой собственный префикс:

 $url = "http://www.treasury.gov/resource-center/data-chart-center/interest-rates/pages/XmlView.aspx?data=yieldyear&year=2015"; $element = simplexml_load_file($url); $element->registerXPathNamespace( 'atom', 'http://www.w3.org/2005/Atom' ); $element->registerXpathNamespace( 'meta', 'http://schemas.microsoft.com/ado/2007/08/dataservices/metadata' ); foreach ($element->xpath('//atom:entry/atom:content/meta:properties') as $properties) { $properties->registerXpathNamespace('data', 'http://schemas.microsoft.com/ado/2007/08/dataservices'); echo $properties->xpath('data:Id')[0], "\n"; echo $properties->xpath('data:NEW_DATE')[0], "\n\n"; } 

Вывод:

 6257 2015-01-02T00:00:00 6258 2015-01-05T00:00:00 6259 2015-01-06T00:00:00 6260 2015-01-07T00:00:00 6261 2015-01-08T00:00:00 ... 

Вам нужно будет зарегистрировать свои префиксы в элементе, который вы хотите называть xpath() . В примере я использовал разные префиксы, чтобы вы могли видеть, что вам не нужно знать префикс – только пространство имен.

В DOM это отдельный объект и DOMXpath:evaluate() может возвращать скалярные значения напрямую.

 $document = new DOMDocument(); $document->loadXml($xml); $xpath = new DOMXpath($document); $xpath->registerNamespace('atom', 'http://www.w3.org/2005/Atom'); $xpath->registerNamespace('meta', 'http://schemas.microsoft.com/ado/2007/08/dataservices/metadata'); $xpath->registerNamespace('data', 'http://schemas.microsoft.com/ado/2007/08/dataservices'); foreach ($xpath->evaluate('//atom:entry/atom:content/meta:properties') as $properties) { echo $xpath->evaluate('string(data:Id)', $properties), "\n"; echo $xpath->evaluate('string(data:NEW_DATE)', $properties), "\n\n"; } 

Как и в вашем другом вопросе , вы можете использовать подход с xpath :

 $xml = simplexml_load_file($url); foreach ($xml->entry as $entry) { // loop over the entries print_r($entry->xpath('//d:BC_3MONTH')); // gives you the actual BC_3MONTH print_r($entry->xpath('//d:Id')); // the actual ID }