#php #html #xml
#php #HTML #xml
Вопрос:
У меня есть XML-документ без тегов CDATA и встроенного HTML. Как мне извлечь этот HTML, чтобы манипулировать им в PHP для отображения?
Пример:
<?xml ...>
<main>
<book>
<title>Title of Book</title>
<description>
<p>Paragraph 1 describing book.<br />blah blah</p><p>2nd Paragraph</p>
</description>
</book>
</main>
Я хочу извлечь <p>Paragraph 1 describing book.<br />blah blah</p><p>2nd Paragraph</p>
в переменную. Или echo для отображения в php с использованием SimpleXML.
Я пытался:
$test = new SimpleXMLElement($xmlfile);
echo $test->{'main'}->{'book'}->{'description'};
и я просто получаю пустую строку.
Ответ №1:
сначала вы должны перенести special symbols
в xml
ссылка:http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references
И это может сработать.
$xml=<<<MMT
<main>
<book>
<title>Title of Book</title>
<description>
<p>Paragraph 1 describing book.<br />blah blah</p><p>2nd Paragraph</p>
</description>
</book>
</main>
MMT;
$xml = preg_replace('@<p>(.*?)</p>@','amp;<pamp;>$1amp;</pamp;>',$xml);
$xml = str_replace('<br />','amp;<br /amp;>',$xml);
$data = simplexml_load_string($xml);
$str = $data->book->description;
$str = preg_replace('@amp;<pamp;>$1amp;</pamp;>@','<p>(.*?)</p>',$str);
$str = str_replace('amp;<br /amp;>','<br />',$str);
echo $str;
Или, что ЛУЧШЕ, если у вас есть только один цикл, вы можете вставить <![CDATA[
]]>
для стандартных XML-данных formart:
$xml=<<<MMT
<main>
<book>
<title>Title of Book</title>
<description>
<p>Paragraph 1 describing book.<br />blah blah</p><p>2nd Paragraph</p>
</description>
</book>
</main>
MMT;
$xml = preg_replace('@<description>(.*?)</description>@is','<description><![CDATA[\1]]></description>',$xml);
$data = simplexml_load_string($xml);
$str = $data->book->description;
echo $str;
Комментарии:
1. Этот XML поступает от третьей стороны, они не могут добавить CDATA, но добавление способа, который у вас есть, кажется таким очевидным сейчас, я просто изменил, чтобы принимать атрибуты в регулярном выражении тега <description>.
Ответ №2:
Попробуйте:
$test = new SimpleXMLElement($xmlfile);
echo $test->{'main'}->{'book'}->{'description'}->asXML();