2011-12-14 1 views
0

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

Например, ввод 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. Для парсера expat требуется строка. Так что мне нужно сделать одну из двух вещей:

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

  2. Используйте что-то другое, чем expat.

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

+0

Черт, я просто вспомнил о CDATA ... Я попробую. Я обновлю это, если мне удастся это сделать. –

+0

Хорошо, используя CDATA, решил. Я отправлю полный ответ, чтобы помочь кому-то еще, у кого была такая же проблема. Мне придется подождать до тех пор, пока stackoverflow не позволит мне, хотя будет около 7 часов ... :-) –

ответ

0
<?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() занимает $ узла параметр для вывода только конкретный узел


http://www.php.net/manual/en/domdocument.savexml.php

+0

Я действительно смотрел save8ML, прежде чем публиковать этот вопрос, но он не совсем работал на то, что я был делает. В любом случае, спасибо! –

+0

О, я просто понял, что вы имели в виду, не то, что я думал, что вы сделали. Я удалил теги CDATA и проанализировал его с помощью saveXML, и он отлично поработал! –

0

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. Я предлагаю это в надежде, что это спасет кого-то еще бессмысленную головную боль, которую я только что дал себе.

 Смежные вопросы

  • Нет связанных вопросов^_^