Russian Qt Forum
Ноябрь 22, 2024, 22:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Заголовок Xml  (Прочитано 6063 раз)
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« : Март 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.

Если кто сталкивался жду ответа...
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #1 : Март 09, 2010, 04:01 »

Кидаю небольшой самодостаточный (без зависимостей) проект с которым можно поэксперементировать.

В проекте сохранялка настроек через XML (не связана с QSettings) и юнит тест на нее...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.103 секунд. Запросов: 22.