예제 중심으로 작성한 글입니다.
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();
for( int 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();
for( int 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 |