XML 指可扩展标记语言(EXtensible Markup Language)。
XML 是一种很像HTML的标记语言。
XML的设计宗旨是传输数据,而不是显示数据。
XML 标签没有被预定义。您需要自行定义标签。
XML 被设计为具有自我描述性。
XML 是W3C 的推荐标准。
JSON 和 XML 数据都是 “自我描述” ,都易于理解。
JSON 和 XML 数据都是有层次的结构
JSON 和 XML 数据可以被大多数编程语言使用
JSON 不需要结束标签
JSON 更加简短
JSON 读写速度更快
JSON 可以使用数组
1.XML 比 JSON 更难解析。
2.JSON 可以直接使用现有的 JavaScript 对象解析。
3.针对 AJAX 应用,JSON 比 XML 数据加载更快,而且更简单:
获取 XML 文档
使用 XML DOM 迭代循环文档
接数据解析出来复制给变量
获取 JSON 字符串
JSON.Parse 解析 JSON 字符串
本文整理自官方页面 http://xmlsoft.org/ 。
Libxml2是一个用来解析XML文档的函数库。它用C语言写成,并且能为多种语言所调用,例如C语言, C++, C#, Python, Kylix/Delphi, PHP, Ruby, Pascal, Tcl等。Perl中也可以使用XML::LibXML模块。它最初是为GNOME开发的项目,但现在可以用在各种各样的场合。libXML2代码可移植性非常好,因为它基于标准的ANSI C,并采用MIT许可证。它可以移植到各种各样的系统,包括Linux, Unix, Windows, CygWin, MacOS, MacOS X, RISC Os, OS/2, VMS, QNX, MVS, VxWorks等等。
//Define document and node pointers
xmlDocPtr doc = xmlNewDoc(BAD_CAST"1.0");
xmlNodePtr root_node = xmlNewNode(NULL, BAD_CAST"root");
xmlNodePtr curNode; //定义结点指针(你需要它为了在各个结点间移动)
//Set root node
xmlDocSetRootElement(doc,root_node);
//Create a node directly in the root node
xmlNewTextChild(root_node, NULL, BAD_CAST"newNode1", BAD_CAST"newNode1 content");
xmlNewTextChild(root_node, NULL, BAD_CAST"newNode2", BAD_CAST"newNode2 content");
xmlNewTextChild(root_node, NULL, BAD_CAST"newNode3", BAD_CAST"newNode3 content");
//创建一个节点,设置内容和属性,然后加入根节点
xmlNodePtr node = xmlNewNode(NULL, BAD_CAST"node");
xmlNodePtr content = xmlNewText(BAD_CAST"node content");
xmlAddChild(root_node, node);
xmlAddChild(node, content);
xmlNewProp(node, BAD_CAST"attribute", BAD_CAST"yes");
//创建一个儿子和孙子节点
node = xmlNewNode(NULL, BAD_CAST"son");
xmlAddChild(root_node, node);
xmlNodePtr grandson = xmlNewNode(NULL, BAD_CAST"grandson");
xmlAddChild(node,grandson);
xmlAddChild(grandson, xmlNewText(BAD_CAST"this is a grandson node"));
//存储xml文档
int file = xmlSaveFile("CreateedXml.xml", doc);
if (file != -1)
{
cout << "一个文档被写入,写入" << file << "个字节" << endl;
}
xmlDocPtr doc; //定义解析文档指针
xmlNodePtr curNode; //定义结点指针(你需要它为了在各个结点间移动)
char szDocName[] = "D:\\project\\day6\\XMLWrite\\XmlWrite\\XmlWrite\\CreateedXml.xml";
doc = xmlReadFile(szDocName,"UTF-8", XML_PARSE_RECOVER);
if (NULL == doc)
{
cout << "doc err!" << endl;
return -1;
}
curNode = xmlDocGetRootElement(doc);
if (NULL == curNode)
{
cout << "curNode err!" << endl;
xmlFreeDoc(doc);
return -1;
}
curNode = curNode->children;
while (NULL != curNode)
{
//删除newNode1
if (!xmlStrcmp(curNode->name, BAD_CAST "newNode1"))
{
xmlNodePtr tempNode;
tempNode = curNode->next;
xmlUnlinkNode(curNode);
xmlFreeNode(curNode);
curNode = tempNode;
continue;
}
//修改node的属性值
if (!xmlStrcmp(curNode->name, BAD_CAST"node"))
{
xmlSetProp(curNode, BAD_CAST"attribute", BAD_CAST"no");
}
//修改newNode2的内容
if (!xmlStrcmp(curNode->name, BAD_CAST"newNode2"))
{
xmlNodeSetContent(curNode, BAD_CAST"content changed");
}
//增加一个属性
if (!xmlStrcmp(curNode->name, BAD_CAST"newNode3"))
{
xmlNewProp(curNode, BAD_CAST"newAttr", BAD_CAST"YES");
}
//增加一个子节点
if (!xmlStrcmp(curNode->name, BAD_CAST "son"))
{
xmlNewTextChild(curNode, NULL, BAD_CAST "newGrandSon", BAD_CAST "new content");
}
curNode = curNode->next;
}
//存储xml文档
int file = xmlSaveFile("CreateedXml.xml", doc);
if (file != -1)
{
cout << "一个文档被写入,写入" << file << "个字节" << endl;
}
最后记得xmlFreeDoc();
//解析url字段,提取出help;purchase;support;brand;update;product参数
static int parse_bmp(xmlDocPtr doc, xmlNodePtr cur)
{
//assert(doc || cur);
xmlChar* key;
cur = cur->xmlChildrenNode;
while (NULL != cur)
{
//获取help的值
if (!xmlStrcmp(cur->name, (const xmlChar*)"help"))
{
key = xmlNodeListGetString(doc,cur->xmlChildrenNode,1);
cout << "help:%s\r"<< key << endl;
xmlFree(key);
}
//获取purchase的值
if (!xmlStrcmp(cur->name, (const xmlChar*)"purchase"))
{
key = xmlNodeListGetString(doc,cur->xmlChildrenNode,1);
cout << "purchase:%s\r" << key << endl;
xmlFree(key);
}
//获取support的值
if (!xmlStrcmp(cur->name, (const xmlChar*)"support"))
{
key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
cout << "support:%s\r" << key << endl;
xmlFree(key);
}
//获取brand的值
if (!xmlStrcmp(cur->name, (const xmlChar*)"brand"))
{
key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
cout << "brand:%s\r" << key << endl;
xmlFree(key);
}
//获取update的值
if (!xmlStrcmp(cur->name, (const xmlChar*)"update"))
{
key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
cout << "update:%s\r" << key << endl;
xmlFree(key);
}
//获取product的值
if (!xmlStrcmp(cur->name, (const xmlChar*)"product"))
{
key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
cout << "product:%s\r" << key << endl;
xmlFree(key);
}
cur = cur->next;
}
return 0;
}
int main()
{
xmlDocPtr doc; //定义解析文档指针
xmlNodePtr curNode; //定义结点指针(你需要它为了在各个结点间移动)
//xmlChar* szKey; //临时字符串变量
char szDocName[] = "D:\\project\\day5\\XMLProject\\XMLOperation\\1.xml";
//检查解析文档是否成功,如果不成功,libxml将指一个注册的错误并停止。
doc = xmlReadFile(szDocName,"UTF-8",XML_PARSE_RECOVER);
if (NULL == doc)
{
//文档打开错误
cout << "文档打开错误" << endl;
return -1;
}
//确定根节点元素
curNode = xmlDocGetRootElement(doc);
if (NULL == curNode)
{
cout << "根节点错误" << endl;
xmlFreeDoc(doc);
return -1;
}
if (xmlStrcmp(curNode->name, (const xmlChar*)"setting"))
{
cout << "没有setting节点" << endl;
xmlFreeDoc(doc);
return -1;
}
//遍历处理子节点
curNode = curNode->xmlChildrenNode;
while (NULL != curNode)
{
if (!xmlStrcmp(curNode->name,(const xmlChar *)"url"))
{
parse_bmp(doc, curNode);
}
curNode = curNode->next;
}
xmlFreeDoc(doc);
return 0;
}