Удалите пространство имен из XML, использующего PHP

Jonathan корректен. PHP выстраивает действие как отображение таблицы карты ключи к значениям. в некоторых случаях можно получить индекс, если массив будет определен, такой как

$var = array(2,5);

for ($i = 0; $i < count($var); $i++) {
    echo $var[$i]."\n";
}

то вывод будет

2
5

, в этом случае, каждый элемент в массиве имеет узнаваемый индекс, но если Вы тогда делаете что-то как следующий

$var = array_push($var,10);

for ($i = 0; $i < count($var); $i++) {
    echo $var[$i]."\n";
}

, Вы не получаете вывода. Это происходит, потому что массивы в PHP не являются линейными структурами как, они находятся на большинстве языков. Они больше похожи на хэш-таблицы, которые могут или не могут иметь ключей для всех сохраненных значений. Следовательно foreach не использует индексы для проверки по ним, потому что у них только есть индекс, если массив определяется. Если у Вас должен быть индекс, удостоверьтесь, что Ваши массивы полностью определяются прежде, чем проверить по ним и используют для цикла.

18
задан Tomalak 7 August 2009 в 17:27
поделиться

2 ответа

Если вы используете XPath, то это ограничение XPath и , а не PHP. Посмотрите это объяснение на xpath и пространствах имен по умолчанию для получения дополнительной информации.

В частности, это атрибут xmlns = "" в корневом узле, который вызывает проблему. Это означает, что вам необходимо зарегистрировать пространство имен, а затем использовать QName для ссылки на элементы.

$feed = simplexml_load_file('http://www.sitepoint.com/recent.rdf');
$feed->registerXPathNamespace("a", "http://www.domain.com/schema/data");
$result = $feed->xpath("a:Data/a:Something/...");

Важно :

16
ответ дан 30 November 2019 в 07:56
поделиться

Чтобы полностью удалить пространство имен, вам необходимо использовать регулярные выражения (RegEx). Например:

$feed = file_get_contents("http://www.sitepoint.com/recent.rdf");
$feed = preg_replace("/<.*(xmlns *= *[\"'].[^\"']*[\"']).[^>]*>/i", "", $feed); // This removes ALL default namespaces.
$xml_feed = simplexml_load_string($feed);

Затем вы удалили все пространства имен xml перед загрузкой XML (будьте осторожны с регулярным выражением, потому что, если у вас есть какие-либо поля с чем-то вроде:

<![CDATA[ <Transfer xmlns="http://redeux.example.com">cool.</Transfer> ]]>

, тогда он удалит xmlns изнутри CDATA что может привести к неожиданным результатам.

0
ответ дан 30 November 2019 в 07:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: