Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 09.10.2019
Сообщений: 16
1

Как получить объектную модель из XML, записать в класс и затем вернуть обратно в XML Qt 5.13

09.10.2019, 17:09. Показов 2062. Ответов 6

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток. Есть вот такой кусок xml файла:
XML
1
2
3
4
5
6
7
8
9
10
11
12
<copyright>
<copyrightPara><emphasis>Copyright (C) 2013</emphasis> by each of the following organizations:<randomList>
<listItem><para>big text.</para></listItem>
<listItem><para>big text.</para></listItem>
</randomList></copyrightPara>
<copyrightPara><emphasis>Limitations of Liability:</emphasis></copyrightPara>
<copyrightPara><randomList>
<listItem><para>big text.</para></listItem>
<listItem><para>big text.</para></listItem>
<listItem><para>big text.</para></listItem>
</randomList></copyrightPara>
</copyright>
Я хочу получить объектную модель этого тега, т.е. объект по типу class Copyright{} и вернуть затем обратно в xml. Столкнулся с тем, что если работать через QDomElement и брать значение тегов, то получается, что часть тестка попадает в теги вышестоящего уровня, например:
XML
1
2
3
4
5
6
7
8
9
<copyright>
  <copyrightPara>
     <emphasis>Copyright (C) 2013</emphasis> by each of the following organizations:
         <randomList>
             <listItem><para>big text.</para></listItem>
             <listItem><para>big text.</para></listItem>
         </randomList>
  </copyrightPara>
</copyright>
Как быть в такой ситуации? С чего начать? В интернете примеров много, но они, мягко говоря, все одинаковые и таких случаев я не встречал. Помогите пожалуйста, в какую сторону идти?

Заранее благодарен за ответ.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.10.2019, 17:09
Ответы с готовыми решениями:

Записать List<string> в XML и обратно
Здрасте помогите пожалуйста. Мне нужно вот что, создать XML файл через XDocument, а конкретно .....

Как получить путь до конкретного элмента ? | XML | DOM | Simple XML
Добрый день! Как Вы уже знаете, в Simple XML, чтобы получить доступ в XML файле к какому-либо...

Как отправить на сервер xml запрос с помощью post и получить ответ в xml?
нужно отправить на сервер xml запрос с помощью post и получить ответ в xml, погуглил нашел примеры,...

Как считать информацию из запущенного мной процесса, а затем вернуть её обратно?
Пытаюсь запустить powershell и отправить в него команду, которая запустит в нем скрипт. Задача...

6
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
09.10.2019, 20:55 2
Intruder81, что в этом примере не так?
0
0 / 0 / 0
Регистрация: 09.10.2019
Сообщений: 16
09.10.2019, 21:43  [ТС] 3
В самом примере все так. Но если получить элемент QDomElement для элемента copyrightPara и взять его значение, т.е. domElement.text(), то вернется все, что написано в этом теге, в том числе и значение остальных тегов. Вот я и не понимаю, как взять значение тегов, записать их в вышеописанный класс, а потом построить такой же узел обратно.
Если бы я брал значение тега <para> для головного тега <randomList>, то тут особых проблем нет. Вот поэтому и прошу помощи.
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
09.10.2019, 22:27 4
Лучший ответ Сообщение было отмечено Intruder81 как решение

Решение

Intruder81, вообще - это нормально.

https://www.w3schools.com/xml/dom_nodes.asp
Text is Always Stored in Text Nodes
A common error in DOM processing is to expect an element node to contain text.
However, the text of an element node is stored in a text node.
In this example: <year>2005</year>, the element node <year> holds a text node with the value "2005".
"2005" is not the value of the <year> element!
Добавлено через 15 минут
Вот вам пример для демонстрации:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <QCoreApplication>
#include <QtXml/QDomElement>
#include <QDebug>
 
 
QDebug padding(QDebug dbg, int i)
{
    while(i-- > 0)
    {
        dbg.space();
    }
    return dbg;
}
 
void traverseNode(const QDomNode& node, int i = 0)
{
   QDomNode domNode = node.firstChild();
   while(!domNode.isNull())
   {
       if(domNode.isText())
       {
          QDomText domText = domNode.toText();
          padding(qDebug(), i) << "Text: " << domText.data();
       }
       if(domNode.isElement())
       {
          QDomElement domElement = domNode.toElement();
          padding(qDebug(), i) << "TagName: " << domElement.tagName();
       }
       traverseNode(domNode, i + 4);
       domNode = domNode.nextSibling();
    }
}
 
int main()
{
    QDomDocument domDoc;
 
    QString xml = "<copyright> \
            <copyrightPara><emphasis>Copyright (C) 2013</emphasis> by each of the following organizations:<randomList>\
            <listItem><para>big text.</para></listItem> \
            <listItem><para>big text.</para></listItem> \
            </randomList></copyrightPara> \
            <copyrightPara><emphasis>Limitations of Liability:</emphasis></copyrightPara> \
            <copyrightPara><randomList> \
            <listItem><para>big text.</para></listItem> \
            <listItem><para>big text.</para></listItem> \
            <listItem><para>big text.</para></listItem> \
            </randomList></copyrightPara> \
            </copyright>";
 
    if(domDoc.setContent(xml, true))
    {
        QDomElement domElement = domDoc.documentElement();
        traverseNode(domElement);
    }
}
2
0 / 0 / 0
Регистрация: 09.10.2019
Сообщений: 16
09.10.2019, 22:40  [ТС] 5
Спасибо за совет, только вводная малость отличается от совета. Я тогда приведу другой пример:
<TAG1> this is some text
<TAG2> this is continue text </TAG2>
other text of the tag TAG1
</TAG1>
Попробуйте взять значение тега TAG1 и Вы получите значение тега TAG1 и TAG2. Потом в цикле перебора я возьму значение тега TAG2. Вот только как построить обратную последовательность? Как понять, когда вставлять тег TAG2?

Добавлено через 8 минут
Спасибо Вам огромное. Вот над этим я как раз и ломал голову!!!
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
09.10.2019, 22:47 6
Intruder81,
Попробуйте взять значение тега TAG1 и Вы получите значение тега TAG1 и TAG2.
Я вам как раз привел ссылку, где написано, что текст не является значением TAG1 , а является значением специального текстового элемента, который является дочерним TAG1.

А метод text() просто выводит совокупное текстовое содержимое всех дочерних текстовых элементов. Это нормально.
1
0 / 0 / 0
Регистрация: 09.10.2019
Сообщений: 16
09.10.2019, 22:50  [ТС] 7
Я просто не сразу понял, что Вы написали. Я лишь только начинаю разбираться с XML, поэтому достаточно сложно, когда встречаешься не с тривиальной задачей. По этой теме спросить не у кого просто. Еще раз спасибо Вам огромное.
0
09.10.2019, 22:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.10.2019, 22:50
Помогаю со студенческими работами здесь

Задача: считать xml-файл в DOM, кое-что там подправить, записать результат обратно в той же кодировке.
Задача: считать xml-файл в DOM, кое-что там подправить, записать результат обратно в той же...

Получить данные из XML и записать в БД MySQL
Здраствуйте, скрипт должен брать данные из XML и записывать в mysql: &lt;?xml version=&quot;1.0&quot;?&gt;...

Как получить, а затем вернуть значение выбранное в <select>?
Здравствуйте! Подскажите как получить значение выбранное в &lt;select&gt;? Допустим в селекте 7 строк,...

Выгрузка в XML файл результатов запроса. Создание xml схемы с имеющегося xml файла
Доброго времени суток. Имеется необходимый для загрузки пример XML файла и из него необходимо...

Передать HashMap в другой поток для заполнения, а затем вернуть его обратно
Доброго всем времени суток. Подскажите, как решить вот такую дилемму. Столкнулся со следующей...

Ко всем файлам добавилось .xml, теперь они в формате ***.xls.XML, ***doc.XML (изначально в Word и Excel)
при копировании с одного ноутбука на другом (изначально на новом не было офиса, м.б. из-за этого...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru