2016-01-18 3 views
1

У меня возникли проблемы с загрузкой XML-фида с помощью php-скрипта. Я делаю копию фида на своем веб-сайте и загружаю его, поэтому я знаю, что я отлаживаю. Каждая запись в файле имеет пространство имен (есть несколько разных).Загрузка XML, возможное неправильное пространство имен или неправильное выполнение?

Это мой первый раз, когда мы сталкиваемся с пространствами имен, и я не могу даже загрузить файл. Когда я пытаюсь

$xml = new SimpleXMLElement($result) or die("Error: Cannot create object\n<hr>".$result);

Стреляет ошибку. Это работало для десятка различных каналов, у которых нет пространств имен (или, по крайней мере, я не заметил никаких пространств имен). Я пробовал различные способы получить больше информации о том, почему он не может создать simpleXMLElement, и пока никто из них не возвращает проблему.

Я помахал кормом xml с помощью 4 различных онлайн-валидатов. 3, кажется, используют javascript и говорят, что фид прекрасен, 4-й номер http://www.xmlvalidation.com/ загружает код на свой сайт и возвращает сообщение об ошибке с их сайтом. (С другими xml их валидатор работает нормально.)

Я думаю Я сузил проблему до материала пространства имен. Если я удалю содержимое пространства имен вверху, я могу загрузить файл xml с указанным выше кодом, а затем я получу беспорядок ошибок пространства имен. Ниже вы можете увидеть информацию о пространстве имен.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns1:timeSeriesResponse xsi:schemaLocation="http://www.cuahsi.org/waterML/1.1/ http://waterservices.usgs.gov/WaterML-1.1.xsd" xmlns:ns1="http://www.cuahsi.org/waterML/1.1/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<ns1:queryInfo xmlns:ns2="http://www.cuahsi.org/waterML/1.1/"> 

Ссылка на XML-странице образца http://waterservices.usgs.gov/nwis/iv/?format=waterml,1.1&sites=06306300&parameterCd=00060,00065

+0

Что именно вы хотите сделать? только создать SimpleXmlObject? –

+0

Я хочу обработать XML-канал, извлечь различные данные, которые полезны, а затем использовать его для создания страницы на моем сайте. С помощью каналов из других источников я создал SimpleXmlObject, а затем использовал xpath(), чтобы найти то, что я ищу. Если есть еще один лучший способ, я играю. – Brandan

+0

см. Мой ответ. Надеюсь, он решит вашу проблему. –

ответ

1

попытка ниже решения с использованием различных пространств имен.

$xml_element = simplexml_load_file('http://waterservices.usgs.gov/nwis/iv/?format=waterml,1.1&sites=06306300&parameterCd=00060,00065'); 
$name_spaces = $xml_element->getNamespaces(true); 
print_r($name_spaces); 
$withns1 = $xml_element->children($name_spaces['ns1']); 
$withns2 = $xml_element->children($name_spaces['ns2']); 
$withxsi = $xml_element->children($name_spaces['xsi']); 

var_dump($withns1); 
var_dump($withns2); 
var_dump($withxsi); 

переменная $name_spaces будет иметь список всех пространств имен в документе xml. выход print_r($name_spaces); будет

Array 
(
    [ns1] => http://www.cuahsi.org/waterML/1.1/ 
    [xsi] => http://www.w3.org/2001/XMLSchema-instance 
    [ns2] => http://www.cuahsi.org/waterML/1.1/ 
) 

с использованием выше метода вы можете получить объект XML и итерацию его желаемый результат.

+0

'foreach ($ withns1-> xpath ('// ns1: timeSeries') в качестве $ Station)' Будет ли это правильным способом вызова xpath с вашим кодом? – Brandan

+0

Да, это будет работать, но также зависит от того, какой тип результата вам нужен. лучше использовать 'foreach ($ withns1-> timeSeries-> children ($ name_spaces ['ns1']) в качестве $ Station) {' –

+0

для более подробного просмотра решений по адресу http: // stackoverflow.com/questions/33994551/php-xml-cant-get-values ​​/ 33994948 # 33994948 и http://php.net/manual/en/simplexmlelement.getnamespaces.php –

1

Это должно работать:

$xml = new SimpleXMLElement($your_xml_data, 0, false, 'ns1', true); 
+0

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. - [Из обзора] (/ review/low-quality-posts/10932742) –

+0

Я подумал, что проблема в том, почему загрузка XML-данных в элемент simpleXML невозможна, и предоставление пространства имен в качестве аргумента 4 делает трюк. – Paflow

+0

Это действительно ответ на вопрос, на самом деле это, вероятно, самый близкий к ответу на фактический вопрос, поскольку он использует тот же тип кода. Я не уверен, почему он должен работать, поскольку существует несколько пространств имен, но он работает. – Brandan

Смежные вопросы