Пишу свой парсер, сверяюсь с libxml2 как образцом. сейчас подобрался к парсингу префиксов-неймспейсов. Ощущение что libxml2 не умеет с ними корректно работать вообще:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<aaa xmlns:de="http://www.dolby.com/dcinema/ws/smi/v11/SPL" atr="abc" xmlns:fe="http://somewhere">
some text
<de:bbb atr1="abb" atr2="baa" >aaa</de:bbb>
<de:ccc>aaa</de:ccc>
<fe:ddd>bbb</fe:ddd>
some more text
</aaa>
Что я получаю в итоге у себя (не обрабатываю неймспейсы пока):
space - text
* - attribute
$ - PI
+ - node
} - namespace definition
{ - namespace use
{
'$xml' => {
'*version' => '1.0',
'*encoding' => 'UTF-8',
'*standalone' => 'yes',
' xml' => '\x0A ',
},
'+aaa' => {
'*xmlns:de' => 'http://www.dolby.com/dcinema/ws/smi/v11/SPL',
'*atr' => 'abc',
'*xmlns:fe' => 'http://somewhere',
' aaa' => '\x0A some text\x0A ',
'+de:bbb' => {
'*atr1' => 'abb',
'*atr2' => 'baa',
' de:bbb' => 'aaa',
},
' aaa' => '\x0A ',
'+de:ccc' => {
' de:ccc' => 'aaa',
},
' aaa' => '\x0A ',
'+fe:ddd' => {
' fe:ddd' => 'bbb',
},
' aaa' => '\x0A some more text\x0A ',
},
},
Что я получаю у libxml2:
{
'+aaa' => {
' aaa' => '\x0A some text\x0A ',
'+bbb' => {
' bbb' => 'aaa',
'*atr1' => 'abb',
'*atr2' => 'baa',
'}de' => 'http://www.dolby.com/dcinema/ws/smi/v11/SPL',
'}fe' => 'http://somewhere',
},
' aaa' => '\x0A ',
'+ccc' => {
' ccc' => 'aaa',
'}de' => 'http://www.dolby.com/dcinema/ws/smi/v11/SPL',
'}fe' => 'http://somewhere',
},
' aaa' => '\x0A ',
'+ddd' => {
' ddd' => 'bbb',
'}fe' => 'http://somewhere',
},
' aaa' => '\x0A some more text\x0A ',
'*atr' => 'abc',
'{de' => 'http://www.dolby.com/dcinema/ws/smi/v11/SPL',
'{fe' => 'http://somewhere',
},
},
ЧЯДНТ? Бага? Фича?