Sql Server 2005 中有一个 xml 类型的数据,这种数据的用处是很大的!
以Sql server 2005中自带的AdventureWorks为例:
Individual 表的类型为 XML 的 Demographics 列包含如下信息,单个客户的常用人口统计信息(如婚姻状况、子女数目、教
育、职业、拥有的汽车数和爱好)等,但是用户可能不会填写全部信息,而为每个统计数据都建立一列对数据库设计来说是很费事
的! 因此,在调查中使用一个类型为 XML 的列,而不是创建多个列(每个问题一列)并在数据库中将未回答的问题存储为值 NULL。
存储为 XML 的调查信息也可以提供给客户关系管理系统和商业智能系统。
因此,建立xml文档格式的列是很有必要的!
但是:通过jdbc或hibernate读出来的数据还是xml文档类型的,怎样才能取得其中的信息呢? 我想,自己编写一个程序,解析xml文
档,读出其中数据.
我写了一个解析xml文档的程序,这是一个类似于"词法分析器"的程序,但是功能不强,嵌套的xml文档不能分析出来.但是足够满足
功能了.(时间复杂度为n)
java 代码
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
-
- public class AnalyzeAll {
- private int currentLength;
- private int currentPosition;
- private List list;
- private XmlPOJO xp;
- public AnalyzeAll()
- {
- this.setCurrentLength(0);
- this.setCurrentPosition(0);
- this.list = new ArrayList();
- this.xp = new XmlPOJO();
- }
- public void analyze(String xml)
- {
- this.setCurrentLength(xml.length());
- while(true){
- if((this.getCurrentPosition()+2 )>=this.getCurrentLength())
- break;
- if(xml.substring( getCurrentPosition() ,
- getCurrentPosition() + 1).equals("<"))
- {
- xp = new XmlPOJO();
- this.setCurrentPosition(getCurrentPosition()+1);
- analyzeInside( xml , getCurrentPosition() );
- }
- else this.setCurrentPosition(getCurrentPosition()+1);
- }
- this.printInfo();
- }
- private int analyzeInside(String xml,int cPosition)
- {
-
- boolean flag = true;
- while(true){
- if((this.getCurrentPosition()+2 )>=this.getCurrentLength())
- return 0;
- if(xml.substring(getCurrentPosition(),
- getCurrentPosition() + 1).equals(">"))
- if(flag)
- {
- xp.setElementName(xml.substring(cPosition,
- getCurrentPosition()));
- this.setCurrentPosition(getCurrentPosition()+1);
- this.analyzeProperty(xml, getCurrentPosition());
- return 0;
- }
- else return 0;
- if(xml.substring(getCurrentPosition(),
- getCurrentPosition() + 1).equals(" "))
- flag = false;
- this.setCurrentPosition(this.getCurrentPosition()+1);
- }
-
- }
-
- private void analyzeProperty(String xml, int cPosition)
- {
- while(true){
- if((this.getCurrentPosition()+2 )>=this.getCurrentLength())
- break;
- if(xml.substring(getCurrentPosition(),
- getCurrentPosition() + 2).equals("))
- {
- xp.setProperty(xml.substring(cPosition,getCurrentPosition()));
- this.setToList();
- break;
- }
- this.setCurrentPosition(getCurrentPosition()+1);
- }
- while(true){
- if((this.getCurrentPosition()+2 )>=this.getCurrentLength())
- break;
- if(xml.substring(getCurrentPosition(),
- getCurrentPosition() + 1).equals(">"))
- {
- this.setCurrentPosition(getCurrentPosition()+1);
- break;
- }
- this.setCurrentPosition(getCurrentPosition()+1);
- }
- }
- private void setToList()
- {
- list.add(xp);
- }
-
- private void printInfo()
- {
- Iterator it = list.iterator();
- for(int i = 0 ; i< list.size() ; i++ )
- {
- XmlPOJO xmlpojo = (XmlPOJO)it.next();
- System.out.println("ElementName: "+xmlpojo.getElementName()+", Property: "+xmlpojo.getProperty());
- }
- }
- public int getCurrentLength() {
- return currentLength;
- }
- public void setCurrentLength(int currentLength) {
- this.currentLength = currentLength;
- }
- public int getCurrentPosition() {
- return currentPosition;
- }
- public void setCurrentPosition(int currentPosition) {
- this.currentPosition = currentPosition;
- }
- }
其中使用了一个 XmlPOJO的类,用来保存每条 elementName, property.
java 代码
- public class XmlPOJO {
- private String elementName;
- private String property;
- public String getElementName() {
- return elementName;
- }
- public void setElementName(String elementName) {
- this.elementName = elementName;
- }
- public String getProperty() {
- return property;
- }
- public void setProperty(String property) {
- this.property = property;
- }
-
- }
最后,使用的xml用例测试
xml 代码
- <IndividualSurvey xmlns=http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/IndividualSurvey><TotalPurchaseYTD>8248.99TotalPurchaseYTD><DateFirstPurchase>2001-07-22ZDateFirstPurchase><BirthDate>1966-04-08ZBirthDate><MaritalStatus>MMaritalStatus><YearlyIncome>75001-100000YearlyIncome><Gender>MGender><TotalChildren>2TotalChildren><NumberChildrenAtHome>0NumberChildrenAtHome><Education>BachelorsEducation><Occupation>ProfessionalOccupation><HomeOwnerFlag>1HomeOwnerFlag><NumberCarsOwned>0NumberCarsOwned><Hobby>GolfHobby><Hobby>Watch TVHobby><CommuteDistance>1-2 MilesCommuteDistance>IndividualSurvey>
得出分析结果:
java 代码
- ElementName: TotalPurchaseYTD, Property: 8248.99
- ElementName: DateFirstPurchase, Property: 2001-07-22Z
- ElementName: BirthDate, Property: 1966-04-08Z
- ElementName: MaritalStatus, Property: M
- ElementName: YearlyIncome, Property: 75001-100000
- ElementName: Gender, Property: M
- ElementName: TotalChildren, Property: 2
- ElementName: NumberChildrenAtHome, Property: 0
- ElementName: Education, Property: Bachelors
- ElementName: Occupation, Property: Professional
- ElementName: HomeOwnerFlag, Property: 1
- ElementName: NumberCarsOwned, Property: 0
- ElementName: Hobby, Property: Golf
- ElementName: Hobby, Property: Watch TV
- ElementName: CommuteDistance, Property: 1-2 Miles
即使是10W字节的xml文档也可以在几毫秒的时间内全部分析完毕!
分享到:
相关推荐
程序可以根据用户的设置文件appconfig.xml从关系型数据库中提取信息,生成具有层次关系的XML,可用于BI的ETL或者数据迁移。ELEMENT元素用户设置关系型数据库的表名称(TABLE属性)、外键名称(FOREIGNKEY)、父元素名称...
数据库到XML文件的转换是一个常见的数据交换和存储过程,尤其在需要将结构化数据与不同系统集成时。XML(eXtensible Markup Language)是一种可扩展标记语言,它允许我们以自定义的方式描述数据,使其在不同的软件和...
本任务旨在从XML文件中提取特定的数据字段,并将其导入MySQL数据库。在导入过程中,系统需具备判断能力,能够识别数据库内是否已存在相同的记录,若存在,则跳过该记录以避免重复。 #### 二、关键技术点 1. **XML...
在Java数据库XML驱动的场景下,Jaxen通过解析XPath表达式,帮助从XML文档中找到特定的数据,进而更新或查询数据库。 使用这两个库,开发者可以构建强大的数据交换系统,将数据库中的数据以XML格式导出,方便地进行...
每个表可以对应一个XML根元素,每条记录变为一个子元素,字段则转化为元素的属性或值。 4. **数据转换**:使用编程语言的XML库(如Java的DOM、SAX或StAX,Python的lxml,PHP的DOMDocument)将查询结果转换为XML文档...
下面是一个具体的示例代码,展示如何读取上述XML文件并将数据插入到一个名为`tree`的表中: ```csharp public void ReadXmlToSaveToTableMethodDone() { SqlConnection conn = new SqlConnection("server=david;...
DOM解析器会将整个XML文档加载到内存中,形成一个树形结构,方便遍历和查找,适合小规模的XML文件。SAX解析器则采用事件驱动模型,逐行读取XML,占用内存少,适合处理大型XML文件。根据项目需求,可以选择合适的解析...
这段代码定义了一个`ConfigParser`类,它继承自`DefaultHandler`,主要用于处理XML文档中的各个元素。 ```java public class ConfigParser extends DefaultHandler { // 用于存储解析结果的Properties对象 ...
对于数据库数据到XML的转化,可以先从数据库查询结果中构建一个数据模型,然后使用JDOM将这个模型转换为XML结构。 7. **性能考虑**:虽然JDOM在处理大型XML文档时可能不如SAX或StAX高效,但其简洁的API和面向对象的...
在实际应用中,开发者通常会选择一个数据库驱动,如MySQL、Oracle或PostgreSQL等,这些驱动实现了JDBC接口,以便与特定的数据库系统通信。使用Java,你可以编写SQL语句,执行CRUD(创建、读取、更新、删除)操作,...
在帆软报表软件FineReport中处理存储于数据库字段中的XML文件,需要对XML数据进行解析,从而将数据转换为可用的报表数据源。XML数据通常以字符串形式存储在数据库表中的某字段内,这种数据结构要求使用者采用特定的...
- **设置映射**:创建一个映射文件,用于定义数据库字段与XML元素之间的对应关系。这一步骤非常重要,因为它决定了数据如何被映射到XML文档中的各个节点上。 - **生成XML文档**:基于查询结果和映射规则,将数据转换...
在IT领域,XML与数据库之间的转换是常见的操作,特别是在需要将结构化数据在不同系统间传输或者从静态XML文档中提取数据时。本篇文章将深入探讨XML与数据库间的转换,以及如何利用XML生成Dataset来处理数据。 首先...
这个过程通常用于将数据库中的结构化数据保存为XML格式,以便于数据交换、备份或供其他应用程序使用。以下将详细介绍如何实现这一功能。 首先,我们需要连接到数据库并查询数据。在.NET中,我们可以使用ADO.NET库来...
XML是一种标记语言,用于描述数据,它通过自定义的标签来标识数据类型和内容,使得数据具备了语义含义。这种描述方式使得XML能够有效地表示复杂的数据结构,从而适应各种应用程序和平台的需求。 在关系数据库中,...
1. **XML数据转换**:程序能从一个数据库中提取数据,并将其格式化为XML文档。这可能使用到了Java的DOM(Document Object Model)、SAX(Simple API for XML)或StAX(Streaming API for XML)等解析器来构建或读取...
Java解释XML是从数据库中提取XML数据并对其进行解析和处理的过程,这一过程涉及到Java的XML处理API,如DOM、SAX和StAX等。在Java中,XML被广泛用于存储和交换结构化数据,尤其是在与数据库交互时。下面将详细介绍这...
这包括了XML列类型,使得XML文档可以直接存储在数据库中,以及T-SQL中的XML函数,如SELECT语句的FOR XML子句,用于将查询结果转换为XML格式。 二、XML数据类型 SQL Server 2000引入了新的XML数据类型,允许直接在表...
XML不是传统的数据库,但它可以与数据库结合使用,尤其是在现代的数据驱动应用程序中。当讨论XML与数据库的关系时,主要涉及如何存储、检索和管理XML文档。XML文档可以被存储在关系型数据库(RDBMS)中,通过映射XML...
例如,可以编写一个Java程序,使用JDBC连接数据库,执行SELECT查询,获取"mytable"表的所有数据,再使用DOM API创建XML文档结构,将查询结果写入XML文件。 在Java程序`DBtoXML1`中,首先建立数据库连接,然后使用...