Archive for the ‘DomDocument’ Category

Fragment для фрагмента

Monday, December 17th, 2007

$dom->createDocumentFragment() хорош для того что бы соединить 2 xml документа в один. Я использовал это для того, что-бы слить два вывода и разных классов в один, очень удобно. Но! Слово Fragment в названии функции не просто так, оно подчеркивает, что это должен быть именно фрагмент, а не полный документ со всеми xml объявлениями.

$xml1 = new Xml1();
$doc1 = $xml->dom->saveXML();

$dom = new DOMDocument();
$firstFragment = $dom->createDocumentFragment();
$firstFragment->appendXML($doc1);

В этом случае потерпите ошибку, из за того что $doc1 будет содержать объявления xml, <?xml >. Так что совет для этих целий использовать не saveXML, а saveHTML. В этом случае ошибки не будет.

Исправляем id на xml:id в DOMDocument

Thursday, August 16th, 2007

Недавно писал про, даже не знаю как назвать баг или фичу или что то еще, странность getElementById() для DOMDocument и вот небольшое решение этого.
Создаю класс на основе DOMDocument

class DomDoc extends DOMDocument{

	function loadXML($link){
		$link=preg_replace("/ id=/i", " xml:id=", $link);
		parent::loadXML($link);
	}

}

Как наверно наглядно, весь текст, пока он еще текст, проворачиваю на наличие id и заменить на xml:id а после уже вызываю родительский метод загрузки. после этого уже сам непосредственный код

$link = '<h1 id="link">mymans.org</h1>';

$doc = new DomDoc();
$doc->loadXML($link);
echo "The element is: " . $doc->getElementById('link')->tagName ;

как результат получу

The element is: h1

Получаем все атрибуты

Tuesday, August 14th, 2007

Когда необходимо получить все атрибуты, а не какой то конкретный, у одного тега, упс…, одного нода то делаем так.

$link = '<a xml:id="link" target="blank"
   class="vl" title="mymans" href="http://www.mymans.org">
   mymans.org</a>';

$doc = new DOMDocument();

$doc->loadXML($link);
$aEl = $doc->getElementById('link');
if($aEl->hasAttributes()){

$attrs = $aEl->attributes;
foreach($attrs as $attr){
	echo $attr->name ." = " . $attr->value ."<br />";
	... любой код ...
}

}

php - getElementById или все правильно сделал

Monday, August 13th, 2007

Несомненно getElementById очень полезная функция для DOMDocument. Вернее была бы, если бы она работала по человечески

$link1 = '<a id="link">mymans.org</a>';

$doc = new DOMDocument();
$doc->validateOnParse = true;
$doc->loadXML($link1);

echo "Тег: " . $doc->getElementById('link')->tagName;

по идее мы должны получить “Тег: а”, но не получим.

Нынешняя редакция DOMDocument не понимает простое id="link", для того что бы понимал советуется использовать $doc->validateOnParse = true; но тесты показывают, что это не так, даже если целиком, буква в букву воспользоваться мануалом, всеровно не будет работать.

Когда же сработает?
если заменить id="link" на xml:id="link", при этом можно даже убрать $doc->validateOnParse = true;

Вставляем готовый код в DOMDocument

Tuesday, July 31st, 2007

Задача: поставить кусок готового кода в DOMDocument.
Зачем: ну круто если все формируется через DOMDocument, но когда идет речь о шаблонах или кусках готового кода, то это приходится делать.
Начнем с переменной в которой есть кусок кода

$code="<tr><td>1</td></tr>";

затем сформируем и документ и вставим в него переменную

$dom = new DOMDocument();
$element = $dom->createElement('table');

// непосредственно вставка
$fragment = $dom->createDocumentFragment();
$fragment->appendXML($code);
$element->appendChild($fragment);

$dom->appendChild($element);
header ('Content-type: text/xml');
echo $dom->saveXML();

и на выходе получаем

<?xml version="1.0"?>
<table>
  <tr>
    <td>1</td>
  </tr>
</table>

Пустые ноды это помеха

Wednesday, June 27th, 2007

JavaScript и PHP несмотря на то что оба реализуют DOM поддержку однако по разному относятся к такой буду как пустые ноды. Вот пример

<li id="myli">
 <p>text</p>
</li>

получив li попробуем получить его firstChild.

//javascript
myli=document.getElementById('myli');
console.log(myli.firstChild);

Php выдаст нам элемент р в то время как JavaScript выдаст строчку " \n". А теперь если сделать так

<li><p>text</p></li>

то результат будет уже тот который нам нужен. Как видите проблема в ненужных разрывах строки. Так что в JavaScript вам придется делать проверку на наличие пустых нодов.

Добавляем Node вперед всех

Monday, June 18th, 2007

В отличие от линейного програмирования, DOMDocument позволяет формировать вставлять узлы выше ранее созданных
созадим абзац, ссылку и текст

$tempP=$dom->createElement('p');
$tempA=$dom->createElement('a', 'mymans.org');
$tempText=$dom->createTextNode(' - посетить');

пометим текст в нутрь абзаца

$tempP->appendChild($tempText);

а теперь ссылку перед текстом

$tempP->insertBefore($tempA, $tempP->childNodes->item(0));

Наследование в классах

Wednesday, June 13th, 2007

Вот небольшой пример наследования класса DOMDocument.

class myDom extends DOMDocument{

	function createEl($name, $value, $attr) {
		$element = $this->createElement($name, $value);
		$element->setAttribute($attr[0], $attr[1]);
		$this->appendChild($element);
		return $this->saveXML();
	}

}

$myDom = new myDom();
echo $myDom->createEl('a','button',
    array('href', 'http://www.mymans.org')
   );

обратите внимание на отсутствие конструктора, нам он и не нужен здесь, та как наследуется из родительского класса, как впрочем и все остальные функции. поэтому и обращение идет через $this

Добавляем коммментарии

Monday, June 4th, 2007

Комментарии в DOMDocumente

$dom = new DOMDocument();
$element = $dom->createElement('values');
$comment = $dom->createComment('нелло');
$element->appendChild($comment);
$dom->appendChild($element);
header ("Content-type: text/xml");
echo $dom->saveXML();

и вот что у нас на выходе

<?xml version="1.0"?>
<values>
 <!--нелло-->
</values>

Красивый ouput для View Source

Wednesday, April 18th, 2007

если вставать xml внутрь документа то как правило он начинает выглядеть как длинная колбаса, без пробелов и отступов, для тех кому это важно можно сделать так:

$dom = new DOMDocument('1.0', "utf8");
$dom->formatOutput = TRUE;

тогда вывод становится отформатированным, вместо

 ./ee.php | cat -n
     1  <?xml version="1.0" encoding="utf8"?><values/>

теперь выглядит так

     1  <?xml version="1.0" encoding="utf8"?>
     2  <values/>

В некоторых случаях это может приводить к ошибкам при чтении, так как добавляются пустые текстовые ноды, а их надо отсеивать. Хотя в любом случает надо обходить пустые ноды