Как извлечь HTML-блок из XML-документа с помощью PHP

#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();