Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: X технологии > DOM vs XSLT


Автор: Alx 17.5.2007, 16:10
привет.

есть большой (или не очень) xml файл. задача: выбрать из него некоторые элементы, слегка отформатировать их и вернуть. но таких задач, предположим много (все немного различаются). чем лучше воспользоваться? средствами DOM или написать XSL-трансформаторы и подгружать их скриптом к xml файлу? на мой взгяд, второе прощё. что скажете?

Автор: BuShaRt 18.5.2007, 00:52
Alx, 
Смотря в каких условиях требуеться форматирование элиментов...

Автор: Alx 18.5.2007, 18:29
BuShaRt, 
можно поподробнее?

Автор: WolfON 18.5.2007, 18:47
Тем что быстрее будет работать в данном случае )
Узнать, что быстрее заработает можно только на собственном опыте, хотя по моему парсер DOM будет побыстрее.
А можно ведь и сделать все регулярками, если не очень сложный xml

Автор: Golda 18.5.2007, 22:26
Добавлю еще пару вариантов. 

1) Можно использовать заранее подготовленный класс (по Интернету таких полно валяется) для преобразования xml в массив, изменить значение элементов массива и обратным преобразованием записать xml

2) В случае, если не предвидится изменений структуры xml, а меняются только значения элементов, или изменения структуры незначительны, можно использовать SimpleXML. Если преобразования соответвуют этому типу, считаю вариант предпочтительным. Он позволяет работать с xml наиболее лаконичным и интиутивным способом.

Выбор зависит от задачи. Например, при существенных изменениях структуры (предельный случай: на выходе должен получиться не XML вообще), удобнее XSL преобразования. Вариант с DOM, по моему опыту, наиболее громоздкий, и наименее обобщаемый: при самом незначительном изменении задачи приходится писать другую функцию. 
 

Автор: Alx 19.5.2007, 00:41
Golda, 
мне simpleXML вообще не нравится.. неужобная работа с NS, аттрибутами..
но все равно, спасибо smile

Автор: Alx 19.5.2007, 02:26
и как с кириллицей SimpleXML работать я тоже не понял..

Автор: Golda 19.5.2007, 23:36
Alx, SimpleXML подходит, конечно, не для всех задач. Если тебуются серьезные изменения структуры, он не подходит. Но как раз в ситуации

Цитата

выбрать из него некоторые элементы, слегка отформатировать их и вернуть


это обычно наиболее удобный вариант.

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

Код

<?xml version="1.0" standalone="yes"?>
<book>
    <chapter>Odessa</chapter>
    <chapter attr1="val1" attr2="val2">Ariel</chapter>
    <chapter>Ramat-Gan</chapter>
</book>



Код

$xml = simplexml_load_file('test.xml');
echo  $xml->chapter[1]['attr1'] . '<br/>';
$xml->chapter[1]['attr2'] = 'new val';
$xml->chapter[1]['attr3'] = 'there was no such attribute before';
$xml->chapter[2] = "Kiev";
echo htmlspecialchars($xml->asXML());


А по поводу кириллицы, работайте в UTF-8. При любом методе работы с XML меньше проблем, когда работаешь с Unicode. Хотя я согласна, что DOM позволяет программисту что-то рассказать о своей кодировке, все равно, если это не UTF-8, c национальными алфавитами жди проблем

Автор: Alx 20.5.2007, 08:55
Golda, 
Спасибо.. а как мне русские слова то вывести?

Код

<?php
$r = simplexml_load_string("<root>привет!</root>");
echo $r->asXML();
?>


возвращает ошибки:

Цитата

Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : Input is not proper UTF-8, indicate encoding ! Bytes: 0xEF 0xF0 0xE8 0xE2 in h:\home\dev\www\xml\_test\php5\encoding.php5 on line 3

Warning: simplexml_load_string() [function.simplexml-load-string]: <root>привет!</root> in h:\home\dev\www\xml\_test\php5\encoding.php5 on line 3

Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in h:\home\dev\www\xml\_test\php5\encoding.php5 on line 3

Fatal error: Call to a member function asXML() on a non-object in h:\home\dev\www\xml\_test\php5\encoding.php5 on line 4

Автор: Golda 20.5.2007, 18:25
Можете использовать iconv() (только убедитесь, что у Вас установлен этот extention), а еще проще, сохраните свой скрипт (файл) в UTF-8 

Автор: Alx 22.5.2007, 13:39
Цитата(Golda @  20.5.2007,  18:25 Найти цитируемый пост)
а еще проще, сохраните свой скрипт (файл) в UTF-8  

спасибо, но тогда при присутствии строки

header('Content-Type:application/xml');

возникает такая ошибка:

Цитата

Warning: Cannot modify header information - headers already sent by (output started at h:\home\dev\www\ajax\_own\tourfirm\sources\smartselect.php:1) in h:\home\dev\www\ajax\_own\tourfirm\sources\smartselect.php on line 5


при кодировке ANSI - её нет..

Добавлено @ 13:41
Denwer+PHP5

Автор: Golda 22.5.2007, 14:04
Эта ошибка не имеет отношения к XML. Просто у Вас в файле до <?php остался какой-то пробел, табуляция или перевод строки. Поэтому, когда Вы пытаетесь вызывать посылать заголовок (неважно какой) с помощью header(), он ругается, что вывод уже начался и больше заголовки послать не получится. Проверьте, что до открывающего тега <?php ничего нет


Упс, не дочитала, что в кодировке ANSI этой проблемы не возникает. Очень странно. С таким я не сталкивалась. Проверьте на всякий случай, что <?php весь набран латиницей.

Автор: Golda 22.5.2007, 22:21
Alx, я нашла источник этой пролемы. Она появляется, если используется скрипт сохраняется в стандартный UTF-8, который использует byte order mark (BOM) в начале файла (подробнее о нем можете прочитать здесь http://unicode.org/faq/utf_bom.html). Эти лишние байты и воспринимаются интерпритатором php как начало вывода. Нужно сохранять в UTF-8 без BOM.

PS. Спасибо, что навели меня на интересную информацию. Я сама обычно использую iconv и на подобный момент не натыкалась  smile 

Автор: Alx 23.5.2007, 01:57
Цитата(Golda @  22.5.2007,  22:21 Найти цитируемый пост)
Нужно сохранять в UTF-8 без BOM.

ох, а как это? на сайте я что-то не нашел.. до того я сохранял в Блокноте (там только ANSI, Unicode, Unicode Big Endian и UTF-8)

Автор: Golda 23.5.2007, 17:02
Ну, в Notepad не очень удобно работать. Без подсветки, подсказок, автодополонения... Мне сложно посоветовать что-либо под Windows. На работе есть возможность использовать ZendStudio под Linux. Знакомые, которые работают с Windows, советуют http://notepad-plus.sourceforge.net. Говорят, его можно удобно настроить под свои нужды. Во всяком случае, я проверила, что там можно выбрать кодировку UTF-8 без BOM (проверяла в версии 4.1.2). Тем более, что он бесплатный. Или поищите любой другой редактор, поддерживающий такую возможность

Автор: Alx 23.5.2007, 21:25
я всю жизнь в блокноте писал, а с недавнего времени на http://delphist.com/GoldenPen.html нашего Vit`а перешёл smile удобная штука) подсветка есть, а больше мне ничего и не надо smile
в любом случае, спасибо большое за ссылку и за помощь!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)