Russian Qt Forum

Qt => XML => Тема начата: break от Март 09, 2010, 03:57



Название: Заголовок Xml
Отправлено: break от Март 09, 2010, 03:57
Раньше всегда использовал для создания заголовка стандартную конструкцию

Код
C++ (Qt)
QDomNode xmlNode = m_doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
m_doc.insertBefore(xmlNode, m_doc.firstChild());
 

при этом там где у меня XML сохрянялся в файл было так

Код
C++ (Qt)
doc.save(out, 4 );

В документации сказано

Цитировать
If this node is a document node, the encoding of text stream str's encoding is set by treating a processing instruction by name "xml" as an XML declaration, if such a one exists, and otherwise defaults to UTF-8. XML declarations are not processing instructions, but this behavior exists for historical reasons. If this node is not a document node, the text stream's encoding is used.

При этом все как бы работало но заметил что при создании XML заголовок такой

Цитировать
<?xml version="1.0" encoding="UTF-8"?>

а если его потом открыть и сделать doc.setContent , поизменять ноды и сохранить (естественно m_doc.createProcessingInstruction заново не вызывается, т.к. нода содержащая эту инструкцию в читаемом документе уже есть), то заголовок становится таким

Цитировать
<?xml version='1.0' encoding='UTF-8'?>

Почему кавычки заменились на апострофы? Баг или фича - я пока не могу никак понять...

Кроме того почитав доку, нашел другой способ задания заголовка с которым он уже не меняет свой вид
1) m_doc.createProcessingInstruction для создания ноды с указанием кодировки не вызываем вообще!
2) при сохранении делаем так

Код
C++ (Qt)
QTextStream out(&ofile);
out.setCodec( QTextCodec::codecForName("UTF-8") );
doc.save(out, 4, QDomNode::EncodingFromTextStream );
 

теперь заголовок всегда выгляит так
<?xml version="1.0" encoding="UTF-8"?>

Кроме того если использовать 2-й способ то даже если стереть заголовок из XML вручную - он будет дописан при первом пересохранении, а вот при первом (по крайней мере у меня createProcessingInstruction вызывался только при создании нового xml - чтобы не анализировать есть ли он там) не будет, соответственно второй способ всегда перекодирует файлы при записи, а первый только при создании xml.

Если кто сталкивался жду ответа...


Название: Re: Заголовок Xml
Отправлено: break от Март 09, 2010, 04:01
Кидаю небольшой самодостаточный (без зависимостей) проект с которым можно поэксперементировать.

В проекте сохранялка настроек через XML (не связана с QSettings) и юнит тест на нее...