1 /** 2 *练习libxml库,创建通讯录xml文档,新增一个通讯录, 3 *如果xml文件存在,则添加一个新节点 4 *如果xml文件不存在,则新建一个xml文件 5 * 6 *@author: Anker @date: 2014/02/09 7 * */ 8 9 #include
10 #include <
string.h>
11 #include
12 #include
13
14 #include
15 #include
16 #include
17
18
#define PHONE_BOOK_FILE "phone_book.xml"
19
#define ID_STR_LEN 16
20
#define NAME_STR_LEN 32
21
#define TEL_STR_LEN 16
22
#define ADDR_STR_LEN 128
23
24
//
电话通讯录结构体
25 typedef
struct
phone_t {
26
int id;
//
编号
27
char name[NAME_STR_LEN];
//
姓名
28
char tel[TEL_STR_LEN];
//
电话
29
char address[ADDR_STR_LEN];
//
地址
30
}phone;
31
32
//
设置通讯录项
33
static
void set_phone_item(phone *
phone_item)
34
{
35
assert(phone_item);
36
37 phone_item->id =
10
;
38 snprintf(phone_item->name, NAME_STR_LEN,
"
%s
",
"
Anker
"
);
39 snprintf(phone_item->tel, TEL_STR_LEN,
"
%s
",
"
"
);
40 snprintf(phone_item->address, ADDR_STR_LEN,
"
%s
",
"
Shenzheng
"
);
41
}
42
43
//
创建phone节点
44
static xmlNodePtr create_phone_node(
const phone *
phone_item)
45
{
46
assert(phone_item);
47
48
char id[ID_STR_LEN] = {
0
};
49 xmlNodePtr phone_node =
NULL;
50
51 phone_node = xmlNewNode(NULL, BAD_CAST
"
phone
"
);
52
if (phone_node ==
NULL) {
53 fprintf(stderr,
"
Failed to create new node.
"
);
54
return
NULL;
55
}
56
//
设置属性
57 snprintf(id, ID_STR_LEN,
"
%d
", phone_item->
id);
58 xmlNewProp(phone_node, BAD_CAST
"
id
", (xmlChar*
)id);
59
60 xmlNewChild(phone_node, NULL, BAD_CAST
"
name
", (xmlChar *)phone_item->
name);
61 xmlNewChild(phone_node, NULL, BAD_CAST
"
tel
", (xmlChar *)phone_item->
tel);
62 xmlNewChild(phone_node, NULL, BAD_CAST
"
address
", (xmlChar *)phone_item->
address);
63
64
return
phone_node;
65
}
66
67
//
向根节点中添加一个phone节点
68
static
int
add_phone_node_to_root(xmlNodePtr root_node)
69
{
70 xmlNodePtr phone_node =
NULL;
71 phone *phone_item =
NULL;
72
73
//
创建一个新的phone
74 phone_item = (phone *)malloc(
sizeof
(phone));
75
if (phone_item ==
NULL) {
76 fprintf(stderr,
"
Failed to malloc memory.
"
);
77
return -
1
;
78
}
79
set_phone_item(phone_item);
80
81
//
创建一个phone节点
82 phone_node =
create_phone_node(phone_item);
83
if (phone_node ==
NULL) {
84 fprintf(stderr,
"
Failed to create phone node.
"
);
85
goto
FAILED;
86
}
87
//
根节点添加一个子节点
88
xmlAddChild(root_node, phone_node);
89
free(phone_item);
90
91
return
0
;
92
FAILED:
93
if
(phone_item){
94
free(phone_item);
95
}
96
return -
1
;
97
}
98
99
//
创建phone_books
100
static
int create_phone_books(
const
char *
phone_book_file)
101
{
102
assert(phone_book_file);
103
104 xmlDocPtr doc =
NULL;
105 xmlNodePtr root_node =
NULL;
106
107
//
创建一个xml 文档
108 doc = xmlNewDoc(BAD_CAST
"
1.0
"
);
109
if (doc ==
NULL) {
110 fprintf(stderr,
"
Failed to new doc.
"
);
111
return -
1
;
112
}
113
114
//
创建根节点
115 root_node = xmlNewNode(NULL, BAD_CAST
"
phone_books
"
);
116
if (root_node ==
NULL) {
117 fprintf(stderr,
"
Failed to new root node.
"
);
118
goto
FAILED;
119
}
120
//
将根节点添加到文档中
121
xmlDocSetRootElement(doc, root_node);
122
123
if (add_phone_node_to_root(root_node) !=
0
) {
124 fprintf(stderr,
"
Failed to add a new phone node.
"
);
125
goto
FAILED;
126
}
127
//
将文档保存到文件中,按照utf-8编码格式保存
128 xmlSaveFormatFileEnc(phone_book_file, doc,
"
UTF-8
",
1
);
129
//
xmlSaveFile("test.xml", doc);
130
xmlFreeDoc(doc);
131
132
return
0
;
133
FAILED:
134
if
(doc) {
135
xmlFreeDoc(doc);
136
}
137
138
return -
1
;
139
}
140
141
static
int add_phone_node(
const
char *
phone_book_file)
142
{
143
assert(phone_book_file);
144
145 xmlDocPtr doc =
NULL;
146 xmlNodePtr root_node =
NULL;
147 xmlNodePtr phone_node =
NULL;
148 phone *phone_item =
NULL;
149
150 doc =
xmlParseFile(phone_book_file);
151
if (doc ==
NULL) {
152 fprintf(stderr,
"
Failed to parser xml file:%s
"
, phone_book_file);
153
return -
1
;
154
}
155
156 root_node =
xmlDocGetRootElement(doc);
157
if (root_node ==
NULL) {
158 fprintf(stderr,
"
Failed to get root node.
"
);
159
goto
FAILED;
160
}
161
162
if (add_phone_node_to_root(root_node) !=
0
) {
163 fprintf(stderr,
"
Failed to add a new phone node.
"
);
164
goto
FAILED;
165
}
166
//
将文档保存到文件中,按照utf-8编码格式保存
167 xmlSaveFormatFileEnc(phone_book_file, doc,
"
UTF-8
",
1
);
168
xmlFreeDoc(doc);
169
170
return
0
;
171
FAILED:
172
if
(doc) {
173
xmlFreeDoc(doc);
174
}
175
176
return -
1
;
177
}
178
179
int main(
int argc,
char *
argv[])
180
{
181
char *phone_book_file =
PHONE_BOOK_FILE;
182
183
if (argc ==
2
) {
184 phone_book_file = argv[
1
];
185
}
186
187
if (access(phone_book_file, F_OK) ==
0
) {
188
//
文件存在,添加一个新的phone节点
189
add_phone_node(phone_book_file);
190
}
191
else
{
192
//
文件不存在,创建一个信息的phone book
193
create_phone_books(phone_book_file);
194
}
195
196
return
0
;
197 }
今天的文章
libxml2使用(libxml-2.0)分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/58356.html