XML解析存储到数据库——详解 (解析xml存入数据库)

XML是一种标记语言,广泛应用于数据交换和储存上。因为它的语法规则简单、可扩展性强,所以XML已成为一种重要的数据格式。为了方便数据的建立和管理,将XML格式的数据解析后存储到数据库中,可以极大地方便数据和信息的处理。本文将详细讲解如何将XML解析存储到数据库中。

一、XML解析

解析是指从数据流或程序源代码或其他输入中读取数据,并将其转化成一种可执行或其他有意义的数据结构。在XML中,解析器可以把XML文档转化成内部格式或其他格式的数据。XML解析技术的实现是依托于XML的标记语言,通过对标记的解析来达到数据的抽取、解析和处理。在使用XML解析时,可采用以下几种方式:

1. DOM解析

DOM解析是一种基于树形结构的解析方式,将整个XML文档加载到内存中,读取DOM树的节点和属性值,从而分析和处理XML数据。DOM解析方式确保整个XML文件都被完整的装入内存,并被放入树形结构中。DOM解析的主要优点是易于编程和理解,但缺点是消耗大量内存,仅适合解析较小的XML文件。

2. SAX解析

SAX解析采用事件驱动的方式读取数据流,逐步解析XML文档,每当解析完文档中的一个元素就会触发SAX事件。SAX解析方式处理XML文档的过程中不需要把整个文档装入内存,因此可以处理大型XML文件。但该解析方式需要编写大量的事件处理程序,使用较为繁琐。

二、将XML 存储到MySQL数据库

MySQL是一种开源的关系型数据库管理系统,广泛应用于Web应用程序的开发中。将XML数据存储到MySQL中可以方便的对数据进行管理和操作。下面是一些将XML存储到MySQL的方法。

1. 将XML数据转成MySQL SQL语句

在将XML数据存储到MySQL中,一种常用的方式是将XML数据转成MySQL SQL语句。具体实现思路是通过解析XML文件获取XML数据,然后用解析到的XML数据的值作为参数,再拼接成MySQL的SQL语句,最后执行SQL语句并将数据存储到MySQL中。这种方法需要编写大量的代码,但是存储效果较好,数据安全。

2. 使用JDBC将XML数据存储到MySQL

JDBC是Java数据库连接的标准API,用于在Java应用程序和数据库之间进行连接。在使用JDBC进行XML数据存储时,需要使用Java语言中的DOM或SAX解析器对XML文件进行解析,从而将数据读取出来,然后再使用JDBC将数据存储到MySQL数据库中。该方法要求程序员对JDBC和XML解析器非常熟悉,初学者耗费的时间和精力相对较大。

三、细节处理

将XML解析后存储到数据库中需要注意以下细节:

1. 数据库设计要合理,每个表中字段的类型和长度应与XML中定义的类型和长度一致。

2. 异常数据异常处理,如存在重复数据需要进行数据去重等操作,且在XML解析时细节数据的录入也需要一定的判断和操作。

3. 对于大批量的XML数据,需要及时清理数据,避免造成数据库过大而影响程序的性能。

4. MySQL数据库需要进行及时的备份,以免因为误删除而导致数据的丢失。

综上所述,XML解析存储到数据库是一种有效的数据处理方法。将XML解析后存储到MySQL数据库中,可以更方便地对XML数据进行管理和分析。当然,在实现过程中还需要对数据库和程序进行详细的设计和处理,使数据的存储和管理变得更为高效和稳定。

相关问题拓展阅读:

从ftp上下载每天的xml文件到本地,再解析本地的xml文件中的数据并将其存入sqlserver数据库中

不清楚.

用 “易语言”就很简单了.

我自己做了一这烂纯昌样的东西基本和饥扒你这个裤兄一样.

我给你个解析的代磨袜毕码吧~具体存数据库得根据实际情况来

#include “StdAfx.h”

#include “parse.h”

#include

#include “stdafx.h”

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

parse::parse()

//int parse::parsexml()

{

xmlDocPtr doc;//定义解析文档指针

xmlNodePtr curNode; //定义结点指针(你需要它为了在各个结点间移动)

xmlChar *szKey;//好核临时字符串变量

char *szDocName;

doc = xmlReadFile(“SimACQ_Config.xml”,”GB2312″,XML_PARSE_RECOVER); //解析文件

//检查解析文档是否成功,如果不成功,libxml将指一个注册的错误并停止。

if (NULL==doc)

{

fprintf(stderr,”Document not parsed successfully. /n”);

/*return -1;*/

}

curNode = xmlDocGetRootElement(doc); //确定文档根元素

/*检查确瞎芹认当前文档中包含内容*/

if (NULL == curNode)

{

fprintf(stderr,”empty document/n”);

xmlFreeDoc(doc);

/*return -1;*/

}

/*在这个例子中,我们需要确认文档是正确的类型。“root”是在这个示例中使用文档的根类型。*/

if (xmlStrcmp(curNode->name, BAD_CAST “SIMCONFIG”))

{

fprintf(stderr,”document of the wrong type, root node != mail”);

xmlFreeDoc(doc);

/*return -1; */

}

curNode = curNode->xmlChildrenNode;

xmlNodePtr propNodePtr = curNode;

while(curNode != NULL)

{

//取出节点中的内容

if ((!xmlStrcmp(curNode->name, (const xmlChar *)”ComConfig”)))

{

xmlNodePtr comConfigPtr= curNode->children;

while(comConfigPtr!=NULL)

{

if((!xmlStrcmp(comConfigPtr->name,(const xmlChar *)”DMS”)))

{

xmlChar* szAttr = xmlGetProp(comConfigPtr,BAD_CAST “IP”);

IP=(char*)szAttr;

szAttr=xmlGetProp(comConfigPtr,BAD_CAST “PORT”);

PORT=atoi((const char *)szAttr);

szAttr=xmlGetProp(comConfigPtr,BAD_CAST “TIMEOUT”);

TIMEOUT=atoi((const char *)szAttr);

xmlFree(szAttr);

}

comConfigPtr=comConfigPtr->next;

}

}

if ((!xmlStrcmp(curNode->name, (const xmlChar *)”Log”)))

{

xmlChar* szAttr = xmlGetProp(curNode,BAD_CAST “Flag”);

if(szAttr!=NULL)

{

if((!xmlStrcmp(szAttr,(const xmlChar *)”True”)))

{

FLAG=true;

}

else

{

FLAG=false;

}

}

szAttr = xmlGetProp(curNode,BAD_CAST “Path”);

if(szAttr!=NULL)

{

PATH=(char*)szAttr;

}

xmlFree(szAttr);

}

if ((!xmlStrcmp(curNode->name, (const xmlChar *)”DMS”)))

{

xmlChar* szAttr = xmlGetProp(curNode,BAD_CAST “Cache”);

if(szAttr!=NULL)

{

Cache=atoi((const char *)szAttr);

}

xmlFree(szAttr);

}

if ((!xmlStrcmp(curNode->name, (const xmlChar *)”SimFile”)))

{

xmlChar* szAttr = xmlGetProp(curNode,BAD_CAST “Type”);

if(szAttr!=NULL)

{

if((!xmlStrcmp(szAttr,(const xmlChar *)”PlainFilm”)))

{

xmlNodePtr FileNodes=curNode->children;

int i=0;

while(FileNodes!=NULL)

{

if((!xmlStrcmp(FileNodes->name,(const xmlChar *)”FILE”)))

{

szAttr = xmlGetProp(FileNodes,BAD_CAST “name”);

if(szAttr!=NULL)

{

/*SIM_PLAIN.Name=(char*)szAttr;*/

strcpy(simulation.SIM_PLAIN.Name,(char*)szAttr);

}

szAttr=xmlGetProp(FileNodes,BAD_CAST “sliceNum”);

if(szAttr!=NULL)

{

simulation.SIM_PLAIN.Num=atoi((char*)szAttr);

}

i++;

}

FileNodes=FileNodes->next;

}

xmlFree(FileNodes);

simulation.SIM_PLAIN.flag=0;

}

if((!xmlStrcmp(szAttr,(const xmlChar *)”Spiral”))){

xmlNodePtr FileNodes=curNode->children;

int i=0;

while(FileNodes!=NULL)

{

if((!xmlStrcmp(FileNodes->name,(const xmlChar *)”FILE”)))

{

szAttr = xmlGetProp(FileNodes,BAD_CAST “name”);

if(szAttr!=NULL)

{

/*SIM_SPIRAL.Name=(char*)szAttr;*/

strcpy(simulation.SIM_SPIRAL.Name,(char*)szAttr);

}

szAttr=xmlGetProp(FileNodes,BAD_CAST “sliceNum”);

if(szAttr!=NULL)

{

simulation.SIM_SPIRAL.Num=atoi((char*)szAttr);

}

i++;

}

FileNodes=FileNodes->next;

}

xmlFree(FileNodes);

simulation.SIM_SPIRAL.flag=0;

}

if((!xmlStrcmp(szAttr,(const xmlChar *)”axial”)))

{

xmlNodePtr FileNodes=curNode->children;

int i=0;

while(FileNodes!=NULL)

{

if((!xmlStrcmp(FileNodes->name,(const xmlChar *)”FILE”)))

{

szAttr = xmlGetProp(FileNodes,BAD_CAST “name”);

if(szAttr!=NULL)

{

/* SIM_AXIAL.Name=(char*)szAttr;*/

strcpy(simulation.SIM_AXIAL.Name,(char*)szAttr);

}

szAttr=xmlGetProp(FileNodes,BAD_CAST “sliceNum”);

if(szAttr!=NULL)

{

simulation.SIM_AXIAL.Num=atoi((char*)szAttr);

}

i++;

}

FileNodes=FileNodes->next;

}

xmlFree(FileNodes);

simulation.SIM_AXIAL.flag=0;

}

}

xmlFree(szAttr);

}

curNode = curNode->next;

}

xmlFreeDoc(doc);

/*return 0;*/

}

有什么不明白的再问吧!

用C#没LS那么复杂

最简单的办法,不需要直接写解析代码,直接使用dataset去load这个xml文件,然后修改dataset中的表与列的名称以符合数据库,然后将dataset插入数据库就可以了

优点:方便快捷

缺点:不灵活、无法处理超大数据的XML

复杂点可以考虑使用DOM去解析XML,然后自己添加数据库的插入、更新代码

优点:灵活,也还算快

缺点:无法陪塌处理超大数据的XML

最复杂轮败的办法就是用SAX去解析XML,然后腊乱颤添加数据库处理代码

优点:灵活、可以处理超大数据的XML,内存占用低

解析xml存入数据库的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于解析xml存入数据库,XML解析存储到数据库——详解,从ftp上下载每天的xml文件到本地,再解析本地的xml文件中的数据并将其存入sqlserver数据库中的信息别忘了在本站进行查找喔。


数据运维技术 » XML解析存储到数据库——详解 (解析xml存入数据库)