`
ido158
  • 浏览: 8595 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

一个提取数据库中类型为 XML 的列的内容的程序

阅读更多

Sql Server 2005 中有一个 xml 类型的数据,这种数据的用处是很大的!

以Sql server 2005中自带的AdventureWorks为例: 

Individual 表的类型为 XML 的 Demographics 列包含如下信息,单个客户的常用人口统计信息(如婚姻状况、子女数目、教

育、职业、拥有的汽车数和爱好)等,但是用户可能不会填写全部信息,而为每个统计数据都建立一列对数据库设计来说是很费事

的! 因此,在调查中使用一个类型为 XML 的列,而不是创建多个列(每个问题一列)并在数据库中将未回答的问题存储为值 NULL。

存储为 XML 的调查信息也可以提供给客户关系管理系统和商业智能系统。

因此,建立xml文档格式的列是很有必要的! 

但是:通过jdbc或hibernate读出来的数据还是xml文档类型的,怎样才能取得其中的信息呢?  我想,自己编写一个程序,解析xml文

档,读出其中数据.

我写了一个解析xml文档的程序,这是一个类似于"词法分析器"的程序,但是功能不强,嵌套的xml文档不能分析出来.但是足够满足

功能了.(时间复杂度为n)

java 代码
  1. import java.util.ArrayList;   
  2. import java.util.Iterator;   
  3. import java.util.List;   
  4.   
  5. public class AnalyzeAll {   
  6.      private int currentLength;   
  7.      private int currentPosition;   
  8.      private List list;   
  9.      private XmlPOJO  xp;   
  10.      public AnalyzeAll()   
  11.      {   
  12.          this.setCurrentLength(0);   
  13.          this.setCurrentPosition(0);   
  14.          this.list = new ArrayList();   
  15.          this.xp = new XmlPOJO();   
  16.      }   
  17.      public void analyze(String xml)    
  18.      {   
  19.          this.setCurrentLength(xml.length());   
  20.          while(true){   
  21.          if((this.getCurrentPosition()+2 )>=this.getCurrentLength())   
  22.                  break;     
  23.          if(xml.substring( getCurrentPosition() , 
  24.            getCurrentPosition() + 1).equals("<"))   
  25.          {   
  26.              xp = new XmlPOJO();       
  27.              this.setCurrentPosition(getCurrentPosition()+1);   
  28.              analyzeInside( xml , getCurrentPosition() );   
  29.          }   
  30.          else this.setCurrentPosition(getCurrentPosition()+1);   
  31.          }     
  32.          this.printInfo();   
  33.      }   
  34.      private int analyzeInside(String xml,int cPosition)   
  35.      {     
  36.             
  37.          boolean flag = true;   
  38.          while(true){   
  39.              if((this.getCurrentPosition()+2 )>=this.getCurrentLength())   
  40.                  return 0;   
  41.              if(xml.substring(getCurrentPosition(), 
  42.              getCurrentPosition() + 1).equals(">"))   
  43.                  if(flag)    
  44.                      {   
  45.                      xp.setElementName(xml.substring(cPosition, 
  46.                                        getCurrentPosition()));   
  47.                      this.setCurrentPosition(getCurrentPosition()+1);   
  48.                      this.analyzeProperty(xml, getCurrentPosition());   
  49.                      return 0;   
  50.                      }   
  51.                  else return 0;   
  52.              if(xml.substring(getCurrentPosition(), 
  53.                 getCurrentPosition() + 1).equals(" "))   
  54.                  flag = false;   
  55.              this.setCurrentPosition(this.getCurrentPosition()+1);   
  56.          }   
  57.                 
  58.      }   
  59.         
  60.      private void analyzeProperty(String xml, int cPosition)   
  61.      {   
  62.          while(true){   
  63.              if((this.getCurrentPosition()+2 )>=this.getCurrentLength())   
  64.                  break;   
  65.              if(xml.substring(getCurrentPosition(), 
  66.                 getCurrentPosition() + 2).equals("))   
  67.              {   
  68.                  xp.setProperty(xml.substring(cPosition,getCurrentPosition()));   
  69.                  this.setToList();   
  70.                  break;   
  71.              }   
  72.              this.setCurrentPosition(getCurrentPosition()+1);   
  73.          }   
  74.          while(true){   
  75.              if((this.getCurrentPosition()+2 )>=this.getCurrentLength())   
  76.                  break;   
  77.              if(xml.substring(getCurrentPosition(), 
  78.                 getCurrentPosition() + 1).equals(">"))   
  79.              {   
  80.                  this.setCurrentPosition(getCurrentPosition()+1);          
  81.                  break;   
  82.              }   
  83.              this.setCurrentPosition(getCurrentPosition()+1);   
  84.          }   
  85.      }   
  86.      private void setToList()   
  87.      {   
  88.          list.add(xp);   
  89.      }   
  90.         
  91.      private void printInfo()   
  92.      {   
  93.          Iterator it = list.iterator();   
  94.          for(int i = 0 ; i< list.size() ; i++ )   
  95.          {   
  96.          XmlPOJO xmlpojo = (XmlPOJO)it.next();   
  97.          System.out.println("ElementName: "+xmlpojo.getElementName()+", Property: "+xmlpojo.getProperty());   
  98.          }   
  99.      }   
  100.     public int getCurrentLength() {   
  101.         return currentLength;   
  102.     }   
  103.     public void setCurrentLength(int currentLength) {   
  104.         this.currentLength = currentLength;   
  105.     }   
  106.     public int getCurrentPosition() {   
  107.         return currentPosition;   
  108.     }   
  109.     public void setCurrentPosition(int currentPosition) {   
  110.         this.currentPosition = currentPosition;   
  111.     }   
  112. }  

 其中使用了一个 XmlPOJO的类,用来保存每条 elementName, property.

 

java 代码
  1. public class XmlPOJO {   
  2.      private String elementName;   
  3.      private String property;   
  4.     public String getElementName() {   
  5.         return elementName;   
  6.     }   
  7.     public void setElementName(String elementName) {   
  8.         this.elementName = elementName;   
  9.     }   
  10.     public String getProperty() {   
  11.         return property;   
  12.     }   
  13.     public void setProperty(String property) {   
  14.         this.property = property;   
  15.     }   
  16.         
  17. }  

 

最后,使用的xml用例测试

xml 代码
  1. <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 代码
  1. ElementName: TotalPurchaseYTD, Property: 8248.99  
  2. ElementName: DateFirstPurchase, Property: 2001-07-22Z   
  3. ElementName: BirthDate, Property: 1966-04-08Z   
  4. ElementName: MaritalStatus, Property: M   
  5. ElementName: YearlyIncome, Property: 75001-100000  
  6. ElementName: Gender, Property: M   
  7. ElementName: TotalChildren, Property: 2  
  8. ElementName: NumberChildrenAtHome, Property: 0  
  9. ElementName: Education, Property: Bachelors   
  10. ElementName: Occupation, Property: Professional   
  11. ElementName: HomeOwnerFlag, Property: 1  
  12. ElementName: NumberCarsOwned, Property: 0  
  13. ElementName: Hobby, Property: Golf   
  14. ElementName: Hobby, Property: Watch TV   
  15. ElementName: CommuteDistance, Property: 1-2 Miles  

即使是10W字节的xml文档也可以在几毫秒的时间内全部分析完毕!

分享到:
评论
2 楼 ido158 2007-10-21  
时间复杂度错了,改下,应该是常数!
1 楼 ido158 2007-09-18  
难道很少人专注于算法吗?我觉得这是一个很有用的程序.比起在数据库中检索大量数据有效率的多! framework的更新速度都是很快的,并且上手也是很快的! 汗...!

相关推荐

    任意类型数据库提取数据转XML文件

    程序可以根据用户的设置文件appconfig.xml从关系型数据库中提取信息,生成具有层次关系的XML,可用于BI的ETL或者数据迁移。ELEMENT元素用户设置关系型数据库的表名称(TABLE属性)、外键名称(FOREIGNKEY)、父元素名称...

    数据库转化为xml文件

    数据库到XML文件的转换是一个常见的数据交换和存储过程,尤其在需要将结构化数据与不同系统集成时。XML(eXtensible Markup Language)是一种可扩展标记语言,它允许我们以自定义的方式描述数据,使其在不同的软件和...

    XML数据提取并导入数据库

    本任务旨在从XML文件中提取特定的数据字段,并将其导入MySQL数据库。在导入过程中,系统需具备判断能力,能够识别数据库内是否已存在相同的记录,若存在,则跳过该记录以避免重复。 #### 二、关键技术点 1. **XML...

    java数据库xml驱动

    在Java数据库XML驱动的场景下,Jaxen通过解析XPath表达式,帮助从XML文档中找到特定的数据,进而更新或查询数据库。 使用这两个库,开发者可以构建强大的数据交换系统,将数据库中的数据以XML格式导出,方便地进行...

    数据库数据生成xml

    每个表可以对应一个XML根元素,每条记录变为一个子元素,字段则转化为元素的属性或值。 4. **数据转换**:使用编程语言的XML库(如Java的DOM、SAX或StAX,Python的lxml,PHP的DOMDocument)将查询结果转换为XML文档...

    将xml文件中的内容写入数据库

    下面是一个具体的示例代码,展示如何读取上述XML文件并将数据插入到一个名为`tree`的表中: ```csharp public void ReadXmlToSaveToTableMethodDone() { SqlConnection conn = new SqlConnection("server=david;...

    java 解析xml类映射数据库 数据库操作 反射机制 源码

    DOM解析器会将整个XML文档加载到内存中,形成一个树形结构,方便遍历和查找,适合小规模的XML文件。SAX解析器则采用事件驱动模型,逐行读取XML,占用内存少,适合处理大型XML文件。根据项目需求,可以选择合适的解析...

    使用xml获取数据库连接

    这段代码定义了一个`ConfigParser`类,它继承自`DefaultHandler`,主要用于处理XML文档中的各个元素。 ```java public class ConfigParser extends DefaultHandler { // 用于存储解析结果的Properties对象 ...

    jdom从数据库和xml拿数据生成xml

    对于数据库数据到XML的转化,可以先从数据库查询结果中构建一个数据模型,然后使用JDOM将这个模型转换为XML结构。 7. **性能考虑**:虽然JDOM在处理大型XML文档时可能不如SAX或StAX高效,但其简洁的API和面向对象的...

    用java编写的从数据库和XML中读写数据的应用程序

    在实际应用中,开发者通常会选择一个数据库驱动,如MySQL、Oracle或PostgreSQL等,这些驱动实现了JDBC接口,以便与特定的数据库系统通信。使用Java,你可以编写SQL语句,执行CRUD(创建、读取、更新、删除)操作,...

    如何在FineReport中解析数据库内XML文件

    在帆软报表软件FineReport中处理存储于数据库字段中的XML文件,需要对XML数据进行解析,从而将数据转换为可用的报表数据源。XML数据通常以字符串形式存储在数据库表中的某字段内,这种数据结构要求使用者采用特定的...

    xml与数据库的数据交换

    - **设置映射**:创建一个映射文件,用于定义数据库字段与XML元素之间的对应关系。这一步骤非常重要,因为它决定了数据如何被映射到XML文档中的各个节点上。 - **生成XML文档**:基于查询结果和映射规则,将数据转换...

    xml与数据库间转换

    在IT领域,XML与数据库之间的转换是常见的操作,特别是在需要将结构化数据在不同系统间传输或者从静态XML文档中提取数据时。本篇文章将深入探讨XML与数据库间的转换,以及如何利用XML生成Dataset来处理数据。 首先...

    .net根据数据库创建xml文件

    这个过程通常用于将数据库中的结构化数据保存为XML格式,以便于数据交换、备份或供其他应用程序使用。以下将详细介绍如何实现这一功能。 首先,我们需要连接到数据库并查询数据。在.NET中,我们可以使用ADO.NET库来...

    基于XML的关系数据库同步技术的研究与实现

    XML是一种标记语言,用于描述数据,它通过自定义的标签来标识数据类型和内容,使得数据具备了语义含义。这种描述方式使得XML能够有效地表示复杂的数据结构,从而适应各种应用程序和平台的需求。 在关系数据库中,...

    xml.rar_XML java_java xml_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是从数据库中提取XML数据并对其进行解析和处理的过程,这一过程涉及到Java的XML处理API,如DOM、SAX和StAX等。在Java中,XML被广泛用于存储和交换结构化数据,尤其是在与数据库交互时。下面将详细介绍这...

    SQL Server 2000 XML应用程序开发指南

    这包括了XML列类型,使得XML文档可以直接存储在数据库中,以及T-SQL中的XML函数,如SELECT语句的FOR XML子句,用于将查询结果转换为XML格式。 二、XML数据类型 SQL Server 2000引入了新的XML数据类型,允许直接在表...

    xml与数据库

    XML不是传统的数据库,但它可以与数据库结合使用,尤其是在现代的数据驱动应用程序中。当讨论XML与数据库的关系时,主要涉及如何存储、检索和管理XML文档。XML文档可以被存储在关系型数据库(RDBMS)中,通过映射XML...

    项目培训XML和数据库

    例如,可以编写一个Java程序,使用JDBC连接数据库,执行SELECT查询,获取"mytable"表的所有数据,再使用DOM API创建XML文档结构,将查询结果写入XML文件。 在Java程序`DBtoXML1`中,首先建立数据库连接,然后使用...

Global site tag (gtag.js) - Google Analytics