Запись в XML

ygerz

Новичок
Запись в XML

Может кому понадобится, вот код записи в файл XML:
PHP:
<?php
$root = simplexml_load_file('test.xml'); 
$node = $root ->addChild('photo');
$node->addChild('MyChild', 'text');
$s = simplexml_import_dom($root );
$s->saveXML('test.xml');
?>
-~{}~ 27.12.07 00:19:

только вот не получается вывести форматированный массив, всё записывается в одну строку.
 

FractalizeR

Новичок
Прошу прощения, но это к чему-то относится или вы просто так это опубликовали?
 

ygerz

Новичок
это в помощь людям, которые как и я ищут отвт на вопрос как добавить данные в xml-файл, но не нашли ответа.
Этот пример, я нигде не встречал, сам придумал, пользуйтесь:)
 

Beavis

Banned
ygerz
для того чтоб додуматься как добавлять данные в XML не надо встречать примеров а можно просто открыть документацию и посмотреть)))
 

ygerz

Новичок
именно, перейдём к коду.
для форматированного вывода есть asXML()
как его сюда прикрутить?

-~{}~ 27.12.07 00:44:

PHP:
echo htmlentities($s->asXML());
вот строчка ля теста, всё выводится в одну строку.
 

AmdY

Пью пиво
Команда форума
О, как раз борюсь с подобной задачой, пока есть только мысля вручную пробегаться и ставить переводы строки и табы
 

Alexandre

PHPПенсионер
ygerz можно сделать все и без simpleXML, используя простой DOM, работать будет быстрее...
 

ygerz

Новичок
@ndrey
да, действительно, эта вещь не нужна. работает и без неё.

Alexandre
на "доме" код больше. и почему быстрее?
 

Alexandre

PHPПенсионер
1-й парсинг производит объект DomObject
2-й парсинг производит объект SimpleXML
 

FractalizeR

Новичок
Автор оригинала: ygerz
именно, перейдём к коду.
для форматированного вывода есть asXML()
как его сюда прикрутить?
У меня как-то была ситуация, когда у меня был XML файл на несколько мегабайт, порожденный 1С-кой. В нем весь XML был написан в одну строку и как следствие, это вешало XML редакторы (мне нужно было его немного отредактировать.

Пришлось так выходить из положения:
PHP:
<?php
$text = file_get_contents("1.xml");
$text=p reg_replace('/(\<\/.+?\>)/', "\$1\r\n", $text);
file_put_contents("2.xml", $text);
?>
По поводу сравнения DOMXML и SimpleXML - я думаю, сравнивать нет смысла. SimpleXML потому и Simple, что он простой сам по себе и не имеет всего функционала DOMXML.
 

kode

never knows best
Re: Запись в XML

Автор оригинала: ygerz
Может кому понадобится, вот код записи в файл XML:
PHP:
<?php
$root = simplexml_load_file('test.xml'); 
$node = $root ->addChild('photo');
$node->addChild('MyChild', 'text');
$s = simplexml_import_dom($root );
$s->saveXML('test.xml');
?>
-~{}~ 27.12.07 00:19:

только вот не получается вывести форматированный массив, всё записывается в одну строку.
PHP:
<?php  
$root = simplexml_load_file('test.xml');
$node = $root ->addChild('photo');
$node->addChild('MyChild', 'text'); 
$root->asXML("test.xml") ?>
у меня всё нормально форматируется :)
 

Alexandre

PHPПенсионер
У меня как-то была ситуация, когда у меня был XML файл на несколько мегабайт, порожденный 1С-кой.
:) не ты первый на эти грабли наступал ...
DOM для разбора больших XML вообще преступно использовать. для этих целей - XMLReader(), и вообще это желательно делать за пределами пхп.
 

ygerz

Новичок
А можно реализовать и так. но опять без форматирования :(

PHP:
<?php
    $xw = new xmlWriter();
	
	$xw->openMemory();
    
    $xw->startDocument('1.0','UTF-8');

    $xw->startElement ('Root'); //ключевой элемент
   
    $xw->startElement('MyChild'); 
    
    $xw->startElement('Name'); 
    $xw->text('ygerz');
    
   
    $xw->endElement(); 
    $xw->endElement(); 
    $xw->endElement(); 
    
    $xw->endDtd();

    $output = $xw->outputMemory(true);
    file_put_contents("test.xml", $output); 

?>
-~{}~ 27.12.07 16:22:

FractalizeR
спасибо, это вариант. но у меня регулярка хромает, пока не разобрался в ней на 100%.
Данное выражение
PHP:
preg_replace('/(<\/.+?\>)/', "\$1\r\n", $text);
переносит только последний тег.
получается вот так,
PHP:
<MyChild><name>2</name>
</MyChild>
а нужно чтобы и name перенёсся.
 

FractalizeR

Новичок
Ну... попробуйте сделайть вторую замену такого плана:

PHP:
preg_replace('/\>\s*\</', ">\r\n<", $text);
Но красивые отступы сделать регуляркой, боюсь, не получится.
 

ygerz

Новичок
Карамба, с этим работает.
FractalizeR
спасибо

Вот код, на мой взгляд симпатичнее, чем "ДОМ":

PHP:
<?php
$root = simplexml_load_file('test.xml'); 
$node = $root->addChild('MyChild');
$node->addChild('Name', 'ygerz');

$text = $root->asXML();
$text=preg_replace('/(<\/.+?\>)/', "\$1\r\n", $text); 
$text=preg_replace('/\>\s*\</', ">\r\n<", $text);
file_put_contents("test.xml", $text); 
?>
 

FractalizeR

Новичок
ygerz
Отлично :))

kode
А что у вас форматируется? У вас исходный XML форматирован?
 

kode

never knows best
Автор оригинала: FractalizeR
ygerz
Отлично :))

kode
А что у вас форматируется? У вас исходный XML форматирован?
PHP:
<?php   

$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
                "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="200" height="100"
     xmlns="http://www.w3.org/2000/svg" version="1.1">
     <rect x="50" y="40" width="100" height="30"/>
     
</svg>
XML;

$root = simplexml_load_string($xml);
$node = $root->addChild('photo'); 
$node->addChild('MyChild', 'text');  
echo "<pre>\n",$root->asXML(),"</pre>\n"; 

?>
PHP:
<pre>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="100" version="1.1">
     <rect x="50" y="40" width="100" height="30"/>     
     <photo>
          <MyChild>text</MyChild>
     </photo>
</svg>
</pre>
Но у меня libxml немного не дефолтный :) Хотя интересно почему <photo> внутрь <svg> записалось?
 
Сверху