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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Создание вложенной структуры xml с помощью dom-модели  (Прочитано 8766 раз)
Pupil
Гость
« : Июнь 07, 2013, 19:55 »

Добрый вечер всем!


При создании xml с помощью DOM не удается создать следующую структуру c промежуточными узловыми элементами "parent_1" и "parent_2":
Код:
<parent value="01">
   
     <parent_1 value="Урал">
 
             <parent_1_2 value="пункты">
                   <coord value="5">
                   <wheater value="10">
                    <violations value="7">
              </parent_1_2>

     </parent_1>

   <parent_2 value="Крым">
 
             <parent_2_1 value="пункты">
                   <coord value="7">
                   <wheater value="11">
                    <violations value="5">
              </parent_2_1>

               <parent_2_2 value="склады">
                   <coord value="7">
                   <wheater value="12">
                    <violations value="8">
              </parent_2_2>

     </parent_2>

</parent>

Код по книге Шлее и по гуглинию в такой конфигурации работает прекрасно:
Код:
<parent value="01">

             <parent_1_2 value="пункты">
                   <coord value="5">
                   <wheater value="10">
                    <violations value="7">
              </parent_1_2>

             <parent_1_2 value="пункты">
                   <coord value="7">
                   <wheater value="11">
                    <violations value="5">
              </parent_1_2>

               <parent_2_2 value="склады">
                   <coord value="7">
                   <wheater value="12">
                    <violations value="8">
              </parent_2_2>
</parent>

Вот такие пироги.

Qt 4.8
Записан
mutineer
Гость
« Ответ #1 : Июнь 07, 2013, 20:34 »

Наверно у тебя в коде что-то неправильно
Записан
_OLEGator_
Гость
« Ответ #2 : Июнь 08, 2013, 00:48 »

Что за нахрен, это же невалидные XML.
Записан
Pupil
Гость
« Ответ #3 : Июнь 08, 2013, 21:10 »

В коде всё правильно. 2-х уровневую структуру он создает. А промежуточные теги не хочет.
Если я задаю "детский" вопрос - киньте линк с примером кратким из которого можно подчерпнуть ответ на мой вопрос. )
Записан
VPS
Гость
« Ответ #4 : Июнь 08, 2013, 22:03 »

Из одной книги: теги (элементы) в XML состоят из двух частей: открывающего и закрывающего дескрипторов.
Внутри этих дескрипторов содержится тело. Для элементов, у которых отсутствует тело есть сокращённая запись, которая совмещает открывающий и закрывающий дескриптор. В этом случае открывающий дескриптор заканчивается символом '/'.

Т.е. в Вашем случае теги без тела должны выглядеть что-то типа этого:
Код:
<coord value="5"/>
<wheater value="10"/>
<violations value="7"/>

А также XML документ должен начинаться с заголовка вида:
Код:
<?xml version="1.0" ?>

П.С.: в интернете есть книги в электронном виде по XML, видимо Вам надо их почитать... Подмигивающий
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #5 : Июнь 09, 2013, 00:13 »

Что за нахрен, это же невалидные XML.
точно невалидные. слешей нехватает.
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Pupil
Гость
« Ответ #6 : Июнь 09, 2013, 12:24 »

Прошу прощения: пример привел неряшливо - нет тегов. Теги при формировании моего файла есть и первая строка с ?xml тоже есть. Вопрос совсем не в этом. Мне напоминает -как если бы я задал среди ученых вопрос о переходе в гиперпространство с уменьшением числа гравитонов, а мне бы ответили, что мой тестовый дисколет не в тот цвет выкрашен. "Не смешите меня за плинтусом. "

Код:
test1:: ...{
QDomDocument doc("reportXML");
const int Indent = 4;
QDomElement parent = doc.createElement("rep_id");

    QDomAttr domAttr = doc.createAttribute("value");
    domAttr.setValue(curr_rep_xml);
    parent.setAttributeNode(domAttr);

    doc.appendChild(parent);

    parent.appendChild(makeElement(doc, "param1", "" , curr_param1));
    parent.appendChild(makeElement(doc, "param2", "" , curr_param2));
    parent.appendChild(makeElement(doc, "param3", "" , curr_param3));
    parent.appendChild(makeElement(doc, "param4", curr_param4));

    doc.appendChild(parent);

QDomElement params = child_param(doc, cp1, cp2,  cp3,  cp4, cp5, cp6, cp7, cp8);

parent.appendChild(params);

QFile file("reportParam.xml");
    if(file.open(QIODevice::WriteOnly)){
        QDomNode xmlNode = doc.createProcessingInstruction("xml",
                                    "version=\"1.0\" encoding=\"KOI8R\"");
        doc.insertBefore(xmlNode, doc.firstChild());
     
        QTextStream out(&file);
        doc.save(out, Indent);
        file.close();
}

QDomElement test1::child_param(QDomDocument &domDoc, int cp1,
                            const QString &cp2, const QString &cp3,
                           const QString &cp4, const QString &cp5,
                           const QString &cp6, const QString &cp7, const QString &cp8)
{
       QDomElement child2_item = makeElement(domDoc, "fields", num);

       child2_item.appendChild(makeElement(domDoc, "num1", "", num1));
       child2_item.appendChild(makeElement(domDoc, "num2", "", num2));
       child2_item.appendChild(makeElement(domDoc, "num3", "", num3));
       child2_item.appendChild(makeElement(domDoc, "num4", "", num4));
       child2_item.appendChild(makeElement(domDoc, "num5", "", num5));
       child2_item.appendChild(makeElement(domDoc, "num6", "", num6));
       child2_item.appendChild(makeElement(domDoc, "num7", "", num7));

       return child2_item;

}

QDomElement test1::makeElement(QDomDocument &domDoc,
                        const QString &strName,
                        const QString &strAttr,
                        const QString &strText)
{
  QDomElement domElement = domDoc.createElement(strName);

  if(!strAttr.isEmpty())
  {
      QDomAttr domAttr = domDoc.createAttribute("value");
      domAttr.setValue(strAttr);
      domElement.setAttributeNode(domAttr);
  }

  if(!strText.isEmpty()){
      QDomAttr domAttr =  domDoc.createAttribute("value");
      domAttr.setValue(strText);
      domElement.setAttributeNode(domAttr);
  }

  return domElement;
}

Как-то так. Если кроме тегов и первых строк - идей нет - я закрою тему и не стану веселить народ )))
Записан
_OLEGator_
Гость
« Ответ #7 : Июнь 09, 2013, 12:41 »

Да кто тебя знает, что выложил - то и смотрим. Телепаты в отпуске.
Лично я для создания xml ручками никогда не использовал QDomDocument. Проще и нагляднее как текст создать и сохранить.
Записан
Pupil
Гость
« Ответ #8 : Июнь 09, 2013, 13:34 »

Рассматривал я такой ручной вариант. Но автоматика перевесила. )
Записан
VPS
Гость
« Ответ #9 : Июнь 09, 2013, 14:49 »

То, что увидел. У вас в фрагменте кода:
Код:
doc.appendChild(parent);

parent.appendChild(makeElement(doc, "param1", "" , curr_param1));
parent.appendChild(makeElement(doc, "param2", "" , curr_param2));
parent.appendChild(makeElement(doc, "param3", "" , curr_param3));
parent.appendChild(makeElement(doc, "param4", curr_param4));

doc.appendChild(parent);
осуществляется попытка вставки одного и того же элемента в верхний узел. Но документация гласит:
"If newChild is a QDomElement and this node is a QDomDocument that already has an element node as a child, newChild is not added as a child and a null node is returned."
Т.е. вставка второй раз - это лишнее...
Потом, Вы постоянно вставляете дочерние элементы в parent, а если необходимо вставлять новые элементы в дочерние к parent, то надо уже через них ссылаться...

П.С.: во вложении немного переделанный Ваш код, который создаёт структуру, которая была в начале поста. А также можно попробовать использовать "QXmlStreamWriter", вроде с ним проще...
« Последнее редактирование: Июнь 09, 2013, 14:55 от vps » Записан
Pupil
Гость
« Ответ #10 : Июнь 10, 2013, 12:26 »

Все получилось! Спасибо огромное! Разобрался.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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