Разбор только части документа с экспатом в PHP - PullRequest
0 голосов
/ 14 декабря 2011

Я строю веб-сайт на PHP, в котором содержимое хранится в файле XML. По сути, у меня есть одна страница index.php, которая проверяет строку запроса и обслуживает соответствующую страницу из XML.

Например, ввод www.mysite.com/?page=home приведет к тому, что PHP-скрипт проверит файл XML на наличие тега <page id="home"> и вставит все, что находится внутри этого тега, в index.php.

Содержимое тегов <page> хранится в формате HTML, таким образом:

<xmlroot>
  <page id="home">
    <h1>An HTML Header Tag!</h1>
    <p>This is a paragraph</p>
  </page>
  [...etc]
</xmlroot>

Я надеялся, что смогу найти соответствующий тег <page> и как-то разобрать содержимое. Я знаю, что все в теге <page> является действительным HTML, поэтому я просто собирался использовать expat для запуска тегов и echo их обратно обратно.

Поэтому я использую метод DOMDocument, чтобы найти правильный <page>, который работает нормально, за исключением того, что содержимое возвращается как элемент DOM. Парсер экспата требует строку. Поэтому мне нужно сделать одну из двух вещей:

  1. Магически преобразует элемент DOM в строку, которая сохраняет все теги нетронутыми, чтобы я мог использовать его в парсере экспатов. Однако, если бы я мог сделать это, мне бы не понадобился парсер экспатов, я мог бы просто отобразить эту преобразованную строку прямо ...

  2. Используйте что-то отличное от экспата.

Кстати, я знаю, что мог бы просто заменить < и > в XML на &lt; и &gt;, но это делает код довольно сложным для чтения и редактирования. Я хотел бы избежать этого, если это возможно.

Ответы [ 2 ]

0 голосов
/ 15 декабря 2011

D'о. Если бы я только подождал еще несколько минут, прежде чем задать вопрос.

Решением было просто заключить все в теги CDATA таким образом:

<xmlroot> 
  <page id="home"> 
    <![CDATA[
      <h1>An HTML Header Tag!</h1> 
      <p>This is a paragraph</p> 
    ]]>
  </page>
  [...etc]
</xmlroot>

Затем я могу взять тег page и вывести содержимое, используя $page->nodeValue. Я предлагаю это в надежде, что это спасет кого-то еще от бессмысленной головной боли, которую я только что себе дал.

0 голосов
/ 14 декабря 2011
<?php

$doc = new DOMDocument('1.0');

$root = $doc->createElement('html');
$root = $doc->appendChild($root);

$head = $doc->createElement('head');
$head = $root->appendChild($head);

$title = $doc->createElement('title');
$title = $head->appendChild($title);

$text = $doc->createTextNode('< This is the title >');
$text = $title->appendChild($text);

echo $head->ownerDocument->saveXML($head);

DOMDocument :: saveXML () принимает параметр $ node для вывода только определенного узла <ч /> http://www.php.net/manual/en/domdocument.savexml.php

...