Разбор XML с использованием PHP - который включает в себя амперсанды и другие символы - PullRequest
3 голосов
/ 17 сентября 2009

Я пытаюсь разобрать файл XML, и одно из полей выглядит следующим образом:

<link>http://foo.com/this-platform/scripts/click.php?var_a=a&var_b=b&varc=http%3A%2F%2Fwww.foo.com%2Fthis-section-here%2Fperf%2F229408%3Fvalue%3D0222%26some_variable%3Dmeee</link>

Кажется, это нарушает синтаксический анализатор. я думаю, что это может быть связано с & в ссылке?

Мой код довольно прост:

<?

$xml = simplexml_load_file("files/this.xml");

echo $xml->getName() . "<br />";

foreach($xml->children() as $child) {
  echo $child->getName() . ": " . $child . "<br />";
}
?>

есть идеи, как мне решить эту проблему?

Ответы [ 6 ]

4 голосов
/ 17 сентября 2009

Размещенный вами фрагмент XML недействителен. Амперсанды нужно экранировать, поэтому парсер жалуется.

3 голосов
/ 17 сентября 2009

Ваш XML-фид не является допустимым XML: & должен быть экранирован как &amp;

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

Возможное «решение» (чувствует себя неправильно, но должно работать) будет означать замену '&', которые не являются частью сущности, на &amp;, чтобы получить действительный XML строка перед загрузкой с помощью синтаксического анализатора XML.


В вашем случае, учитывая это:

$str = <<<STR
<xml>
  <link>http://foo.com/this-platform/scripts/click.php?var_a=a&var_b=b&varc=http%3A%2F%2Fwww.foo.com%2Fthis-section-here%2Fperf%2F229408%3Fvalue%3D0222%26some_variable%3Dmeee</link>
</xml>
STR;

Вы можете использовать простой вызов str_replace, например:

$str = str_replace('&', '&amp;', $str);

И затем проанализируйте строку (теперь XML-допустимо) , которая находится в $str:

$xml = simplexml_load_string($str);
var_dump($xml);

В этом случае должно работать ...


Но учтите, что вы должны позаботиться о сущностях: если у вас уже есть сущность типа '&gt;', вы не должны заменять ее на '&amp;gt;'!

Это означает, что такой простой вызов str_replace не является правильным решением: он, вероятно, нарушит работу многих XML-фидов!

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

2 голосов
/ 17 сентября 2009

Это нарушает синтаксический анализатор, потому что ваш XML неверен - & должен быть закодирован как &amp;.

1 голос
/ 05 июня 2018

Если у вашего XML уже есть некоторый экранирующий символ, он будет сохранен, а амперсанды без экранирования будут исправлены:

$brokenXmlText = file_get_contents("files/this.xml");
$fixed = preg_replace('/&(?!lt;|gt;|quot;|apos;|amp;|#)/', '&amp;', $brokenXmlText);
$xml = simplexml_load_string($fixed);
0 голосов
/ 30 марта 2011

Я думаю, что это поможет вам http://www.php.net/manual/en/simplexml.examples-errors.php#96218

0 голосов
/ 08 октября 2009

Комментарий mjv разрешил это:

В качестве альтернативы использованию &, вы можете рассмотреть вопрос о размещении URL-адресов и других XML-недружественный контент в то есть Блок данных символов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...