본문 바로가기

프로그래밍/시스템

C++ Qt XML

반응형

예제 중심으로 작성한 글입니다.


 

QT에서 XML을 사용하기 위해 헤더파일과 Pro파일에 xml을 추가합니다.

http://doc.qt.io/qt-5/qtxml-module.html

 

1
#include <QtXml>
cs

 

1
QT       += xml
cs

 


 

 

 

● XML 문서 작성

 

○ XML 예제

1
2
3
4
5
<script>
 <os Name="WINDOW"/>
 <os Name="LINUX"/>
 <os Name="UNIX"/>
</script>
cs


○ XML 작성 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
QString File_Path = "C://Users/test.xml";
    QStringList text;
    text.append("WINDOW");
    text.append("LINUX");
    text.append("UNIX");
    QDomDocument doc;
    QDomElement xml = doc.createElement("script");
    doc.appendChild(xml);
 
    foreach( QString txt , text) {
        QDomElement child_element = doc.createElement("os");
        child_element.setAttribute("Name",txt);
        xml.appendChild(child_element);
    }
        SaveXmlFile(&doc,File_Path);
cs

 

6 - xml 문서를 생성한다.

7,8 - xml 문서에 최상위 태그("script")를 추가한다.

11,13 -  하위 태그를 만들고 속성을 부여한다.

15 - xml 파일 저장

1
2
3
4
5
6
7
8
9
10
11
void MainWindow::SaveXmlFile(QDomDocument *doc, QString path)
{
    QFile file(path);
    if (file.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        QTextStream stream(&file);
        stream << doc->toString();
        file.close();
        doc->clear();
    }
}
cs

 

 

● XML 문서 읽기 

 

1
2
3
4
5
6
7
8
9
10
void MainWindow::LoadXmlFile(QDomDocument *doc, QString path)
{
    QFile load_xml_file(path);
    if (load_xml_file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        // Save the xml file content
        doc->setContent(&load_xml_file);
        load_xml_file.close();
    }
}
cs

 

● XML 문서 수정

 

※ XML 문서 작성에서 다뤘던 예제를 사용합니다.

○ XML 예제  

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
<script>
 <os Name="WINDOW">
  <IP value="192.168.0.10">apps0</IP>
  <IP value="192.168.0.11">apps1</IP>
  <IP value="192.168.0.12">apps2</IP>
  <IP value="192.168.0.13">apps3</IP>
  <IP value="192.168.0.14">apps4</IP>
  <IP value="192.168.0.15">apps5</IP>
  <IP value="192.168.0.16">apps6</IP>
  <IP value="192.168.0.17">apps7</IP>
  <IP value="192.168.0.18">apps8</IP>
  <IP value="192.168.0.19">apps9</IP>
 </os>
 <os Name="LINUX">
  <IP value="192.168.0.10">apps0</IP>
  <IP value="192.168.0.11">apps1</IP>
  <IP value="192.168.0.12">apps2</IP>
  <IP value="192.168.0.13">apps3</IP>
  <IP value="192.168.0.14">apps4</IP>
  <IP value="192.168.0.15">apps5</IP>
  <IP value="192.168.0.16">apps6</IP>
  <IP value="192.168.0.17">apps7</IP>
  <IP value="192.168.0.18">apps8</IP>
  <IP value="192.168.0.19">apps9</IP>
 </os>
 <os Name="UNIX">
  <IP value="192.168.0.10">apps0</IP>
  <IP value="192.168.0.11">apps1</IP>
  <IP value="192.168.0.12">apps2</IP>
  <IP value="192.168.0.13">apps3</IP>
  <IP value="192.168.0.14">apps4</IP>
  <IP value="192.168.0.15">apps5</IP>
  <IP value="192.168.0.16">apps6</IP>
  <IP value="192.168.0.17">apps7</IP>
  <IP value="192.168.0.18">apps8</IP>
  <IP value="192.168.0.19">apps9</IP>
 </os>
</script>
cs

 

○ XML 작성 코드

1
2
3
4
5
6
7
8
9
10
11
12
 LoadXmlFile(&doc,File_Path);
        for(int i = 0; i< 3; i++ ){
            QDomNode child_Node = doc.firstChildElement("script").childNodes().item(i);
            for(int j=0; j<10; j++){
            QDomElement ip = doc.createElement("IP");
            QDomText text = doc.createTextNode("apps"+QString::number(j));
            ip.setAttribute("value","192.168.0.1"+QString::number(j));
            child_Node.appendChild(ip);
            ip.appendChild(text);
            }
        }
 SaveXmlFile(&doc,File_Path);
cs

 

1 - xml 문서를 읽는 함수다.

3 - xml의 첫 번째 태그("script")의 자식노드를 모두 가져오고

     자식노드에서 i번 째 노드를 가져온다.

 

5 - 하위 태그를 생성한다.

6 - 하위 태그에 들어갈 내용을 만든다.

7 - 하위 태그에 속성을 부여한다.

 

8 - 자식노드에 하위태그를 붙인다.

9 - 하위태그에 내용을 붙인다.

 

12 - xml 문서 저장

 

만약 다음과 같이 firstChildElement를 여러 번 써야할 경우

함수를 만들어서 코드를 줄입니다.

 

1
doc.firstChildElement("aaa").firstChildElement("bb").firstChildElement("c");
cs

 

 

1
2
3
4
5
6
7
8
9
QDomElement MainWindow::XmlNodeDepth(QDomDocument *doc, int dep)
{
    QDomElement tmp = doc->firstChildElement();
 
    for(int i=1; i<dep; i++)
    tmp = tmp.firstChildElement();
 
    return tmp;
}
cs

 

XmlChildNode = XmlNodeDepth(&doc,3);

 

 

● XML 문서 조회

 

※ XML 문서 수정에서 다뤘던 예제를 사용합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  LoadXmlFile(&doc,File_Path);
 
          QDomElement element = doc.firstChildElement("script");
          QDomNodeList NodeList = element.elementsByTagName("os");
          element = element.firstChildElement("os");
          int Node_Count = NodeList.count();
          forint i = 0; i < Node_Count; i++ )
          {
            qDebug() << element.attribute("Name");
            NodeList = element.elementsByTagName("IP");
            for(int j = 0; j < NodeList.count(); j++ )
            {
              QDomElement ele = NodeList.at(j).toElement();
              qDebug() << ele.attribute("value"<< ele.text();
            }
            element = element.nextSiblingElement();
          }
cs

 

4,10 - 해당 태그 이름을 가진 태그들을 반환한다.

5 - 해당 태그에 하위 태그를 가져온다.

6,11 - 해당 노드의 개수를 반환한다.

9 - 해당 노드의 속성값을 출력한다.

13 - 노드 목록에서 태그를 가져온다.

14 - 해당 노드의 내용 & 속성값을 출력한다.

16 - 다음 태그로 이동한다. (window -> linux -> unix) 

 

 

● XML 노드 삭제

 

○ 특정 하위 노드 삭제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  QDomElement element = doc.firstChildElement("script");
 
          QDomNodeList NodeList = element.elementsByTagName("os");
          element = element.firstChildElement();
 
          int Node_Count = NodeList.count();
 
          for(int i = 0; i < Node_Count; i++  )
          {
               NodeList = element.elementsByTagName("IP");
               int Node_Count2 = NodeList.count();
               forint j= 0; j < Node_Count2; j++ )
               {
                  element.removeChild(NodeList.at(0));
               }
               element = element.nextSiblingElement();
          }
 
SaveXmlFile(&doc,File_Path);
cs

 

 

8~17 - 해당 태그의 자식노드를 모두 제거한다.

 

 

반응형

'프로그래밍 > 시스템' 카테고리의 다른 글

C++ Qt 잡지식  (0) 2018.03.19
C++ Qt 엑셀 사용하기  (0) 2018.03.19
C++ Qt Ui Style Sheet 활용  (0) 2018.03.17
C++ Qt 화면 크기에 따라 레이아웃 조절  (0) 2018.03.16
C++ Qt 배경화면 투명도 설정  (0) 2018.03.15