Что касается ниже XML. Как связать дочерние элементы <m:properties>
с помощью оператора объекта (->)?
$url = "http://data.treasury.gov/feed.svc/DailyTreasuryYieldCurveRateData?$filter=month(NEW_DATE)%20eq%2011%20and%20year(NEW_DATE)%20eq%202015"; $xml = simplexml_load_file($url); foreach( $xml->entry as $entry ) { $element = $xml->entry->content->properties->children(); }
$xml->entry->children();
работает, но $xml->entry->content->properties->children();
не. Я читаю здесь, что двоеточие (":") помещается между префиксом пространства имен и именем имени / атрибута элемента, поэтому properties
является, следовательно, имя элемента, поэтому не уверен, почему нет. Этот вопрос специально посвящен использованию функции object ->
and children()
. Я хочу знать, почему одна и та же логика на разных уровнях XML-документа ведет себя по-разному; это отличается от таких вопросов, которые ищут любое решение для синтаксического анализа данных XML, независимо от того, использует ли он функцию object ->
и children()
или нет.
<entry xmlns="http://www.w3.org/2005/Atom"> <id> http://data.treasury.gov:8001/Feed.svc/DailyTreasuryYieldCurveRateData(6257) </id> <title type="text"/> <updated>2015-11-15T13:40:16Z</updated> <author> <name/> </author> <link rel="edit" title="DailyTreasuryYieldCurveRateDatum" href="DailyTreasuryYieldCurveRateData(6257)"/> <category term="TreasuryDataWarehouseModel.DailyTreasuryYieldCurveRateDatum" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/> <content type="application/xml"> <m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"> <d:Id xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" m:type="Edm.Int32">6257</d:Id> <d:NEW_DATE xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" m:type="Edm.DateTime">2015-01-02T00:00:00</d:NEW_DATE> <d:BC_1MONTH xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" m:type="Edm.Double">0.02</d:BC_1MONTH> <d:BC_3MONTH xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" m:type="Edm.Double">0.02</d:BC_3MONTH> <d:BC_6MONTH xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" m:type="Edm.Double">0.11</d:BC_6MONTH> <d:BC_1YEAR xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" m:type="Edm.Double">0.25</d:BC_1YEAR> <d:BC_2YEAR xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" m:type="Edm.Double">0.66</d:BC_2YEAR> <d:BC_3YEAR xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" m:type="Edm.Double">1.07</d:BC_3YEAR> <d:BC_5YEAR xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" m:type="Edm.Double">1.61</d:BC_5YEAR> </m:properties> </content> </entry>
Вы можете использовать решение с xpath
и указать пространство имен в запросе:
$url = "http://data.treasury.gov/feed.svc/DailyTreasuryYieldCurveRateData?$filter=month(NEW_DATE)%20eq%2011%20and%20year(NEW_DATE)%20eq%202015"; $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 }