acl/lib_acl_cpp/samples/xml/xml.cpp

261 lines
7.1 KiB
C++
Raw Normal View History

// xml.cpp : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨Ӧ<CCA8>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ㡣
//
#include "stdafx.h"
#include <list>
using namespace std;
static void test(void)
{
const char *data =
"<?xml version=\"1.0\"?>\r\n"
"<?xml-stylesheet type=\"text/xsl\"\r\n"
" href=\"http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl\"?>\r\n"
"<!DOCTYPE refentry PUBLIC \"-//OASIS//DTD DocBook XML V4.1.2//EN\"\r\n"
" \"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd\" [\r\n"
" <!ENTITY xmllint \"<command>xmllint</command>\">\r\n"
"]>\r\n"
"<root>test\r\n"
" <!-- <edition> - <!--0.5--> - </edition> -->\r\n"
" <user name = user_name>zsx\r\n"
" <age>38</age>\r\n"
" </user>\r\n"
"</root>\r\n"
"<!-- <edition><!-- 0.5 --></edition> -->\r\n"
"<!-- <edition>0.5</edition> -->\r\n"
"<!-- <edition> -- 0.5 -- </edition> -->\r\n"
"<root name='root' id='root_id'>test</root>\r\n";
acl::xml xml;
#if 1
const char* p = data;
char tmp[2];
while (*p)
{
tmp[0] = *p++;
tmp[1] = 0;
xml.update(tmp);
}
#else
xml.update(data);
#endif
const vector<acl::xml_node*>& elements = xml.getElementsByTagName("user");
if (!elements.empty()) {
vector<acl::xml_node*>::const_iterator cit = elements.begin();
for (; cit != elements.end(); cit++) {
acl::xml_node *node = *cit;
printf("tagname: %s, text: %s\n", node->tag_name() ? node->tag_name() : "",
node->text() ? node->text() : "");
const acl::xml_attr* attr = (*cit)->first_attr();
while (attr)
{
printf("test1: %s=%s\r\n", attr->get_name(), attr->get_value());
attr = (*cit)->next_attr();
}
}
}
xml.reset();
//////////////////////////////////////////////////////////////////////
const char* s2 = "<html><head>Title\r\n</head><body><3E><>λͬѧ<CDAC><D1A7>\r\n"
"<EFBFBD><EFBFBD><EFBFBD>¿<EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ20<EFBFBD>գ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λͬѧ<EFBFBD><EFBFBD>19<EFBFBD><EFBFBD><EFBFBD>°<EFBFBD>֮ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ\r\n"
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸Ŀ<EFBFBD><EFBFBD>ڡ<EFBFBD>\r\n"
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>١<EFBFBD><EFBFBD>¼١<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٵ<EFBFBD>ͬѧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>лл<EFBFBD><EFBFBD>λͬѧ<EFBFBD><EFBFBD><EFBFBD>ϡ<EFBFBD>\r\n"
"<EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><EFBFBD>Ž<EFBFBD><EFBFBD><EFBFBD><EFBFBD>տ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD>ִ<EFBFBD>в<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD>޸ġ<EFBFBD></body></html>\r\n";
xml.update("<dummy_root>");
xml.update(s2);
xml.update("</dummy_root>");
const acl::string& r2 = xml.getText();
printf("\r\n|%s|\r\n", r2.c_str());
printf("------------ the result is: ------------------\r\n");
acl::string buf;
xml.build_xml(buf);
printf("%s\r\n", buf.c_str());
//////////////////////////////////////////////////////////////////////////
acl::xml xml2;
acl::xml_node& root = xml2.get_root();
acl::xml_node* node1, *node2, *node3, *node4;
node1 = &xml2.create_node("test1");
(*node1).add_attr("name1_1", "value1_1")
.add_attr("name1_2", "value1_2")
.add_attr("name1_3", "value1_3");
root.add_child(node1);
printf("----------------------node1's attr valuse list----------------\r\n");
const acl::xml_attr* attr1 = node1->first_attr();
while (attr1)
{
printf("node1: %s=%s\r\n", attr1->get_name(), attr1->get_value());
attr1 = node1->next_attr();
}
printf("----------------------node1's attr end list------------------\r\n");
node2 = &xml2.create_node("test2");
(*node2).add_attr("name2_1", "value2_1")
.add_attr("name2_2", "value2_2");
root.add_child(node2);
node2 = &xml2.create_node("test11");
(*node2).add_attr("name11_1", "value11_1")
.add_attr("name11_2", "value11_2")
.add_attr("name11_3", "value11_3");
node1->add_child(node2);
node2->set_text("hello world!");
node1 = &xml2.create_node("test3");
(*node1).add_attr("name3_1", "value3_1")
.add_attr("name3_2", "value3_2");
node2 = &xml2.create_node("test4");
(*node2).add_attr("name4_1", "value4_1")
.add_attr("name4_2", "value4_2")
.add_attr("name4_3", "value4_3");
root.add_child(node1).add_child(node2);
node1 = &xml2.create_node("test5");
root.add_child(node1);
node2 = &xml2.create_node("test51");
(*node2).add_attr("name51_1", "value51_1")
.add_attr("name51_2", "value51_2");
(*node1).add_child(node2);
node3 = &xml2.create_node("test52");
(*node3).add_attr("name52_1", "value52_1")
.add_attr("name52_2", "value52_2");
node4 = &xml2.create_node("test53");
(*node4).add_attr("name53_1", "value53\"_1")
.add_attr("name53_2", "value53_2");
(*node1).add_child(node3).add_child(node4);
root.add_child("test6", true, "text6")
.add_child("test61", true, "text61")
.add_attr("name61_1", "value61_1")
.add_attr("name61_2", "value61_2")
.add_attr("name61_3", "value61_3")
.add_child("test611", true, "text611")
.add_attr("name611_1", "value611_1")
.add_attr("name611_2", "value611_2")
.add_attr("name611_3", "value611_3")
.get_parent()
.get_parent()
.add_child("test62", true, "text62")
.add_attr("name62_1", "value62_1")
.add_attr("name62_2", "value62_2")
.add_attr("name62_3", "value62_3")
.get_parent()
.add_attr("name6_1", "value6_1")
.add_attr("name6_2", "value6_2")
.add_attr("name6_3", "value6_3");
buf.clear();
xml2.build_xml(buf);
printf("-----------------xml2------------------------\r\n");
printf("%s\r\n", buf.c_str());
printf("-----------------xml2 iterator --------------\r\n");
acl::xml_node* iter = xml2.first_node();
while (iter)
{
if (iter->tag_name())
{
printf("tag: %s", iter->tag_name());
if (iter->text())
printf(", text: %s\r\n", iter->text());
else
printf("\r\n");
}
iter = xml2.next_node();
}
printf("------------------root first level child---------\r\n");
iter = xml2.get_root().first_child();
int n = 0;
while (iter)
{
n++;
if (iter->tag_name())
printf("tag: %s", iter->tag_name());
if (iter->text())
printf(", text: %s\r\n", iter->text());
else
printf("\r\n");
iter = xml2.get_root().next_child();
}
if (n == xml2.get_root().children_count())
printf("ok, children_count: %d\n", n);
else
{
printf("error, n: %d, children_count: %d, enter any key to continue\r\n",
n, xml2.get_root().children_count());
getchar();
}
}
static void test2(void)
{
acl::xml body;
body.get_root().add_child("test", true)
.add_attr("mail", "\"zsxxsz1\" zsxxsz1@test.com")
.add_attr("title", "<EFBFBD><EFBFBD><<3C><>><3E><>\'<EFBFBD><EFBFBD></test><3E>й<EFBFBD><D0B9><EFBFBD>\"<EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>\\\"")
.add_attr("from", "\"zsxxsz2\" zsxxsz2@test.com");
acl::string buf;
body.build_xml(buf);
printf("data: %s\r\n", buf.c_str());
printf("------------------------------------------\r\n");
acl::xml xml(buf.c_str());
const acl::xml_node* node = xml.getFirstElementByTag("test");
if (node == NULL)
printf("test tag null\r\n");
else
{
const char* mail = (*node)["mail"];
const char* title = (*node)["title"];
const char* from = (*node)["from"];
printf("mail: %s\r\n", mail ? mail : "null");
printf("title: %s\r\n", title ? title : "null");
printf("from: %s\r\n", from ? from : "null");
}
}
static void get_html(const char* file)
{
acl::string buf;
if (acl::ifstream::load(file, &buf) == false)
{
printf("load %s error %s\r\n", file, acl::last_serror());
return;
}
acl::xml xml(buf.c_str());
const acl::string& text = xml.getText();
printf("text:{%s}\r\n", text.c_str());
}
int main(int argc, char* argv[])
{
if (argc >= 2)
{
get_html(argv[1]);
return 0;
}
(void) argc;
(void) argv;
test2(); getchar(); return 0;
test();
printf("enter any key to exit\r\n");
getchar();
return 0;
}