xml文档转换存储到sql sever数据库中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了xml文档转换存储到sql sever数据库中相关的知识,希望对你有一定的参考价值。

本人最近在做一个题为xml在关系数据库中存储技术的实现的项目。用java做,要求能够导入一个不太复杂的xml文档,经解析后按照一定的算法将树形结构的xml节点转换成平整的关系表结构。
由于对xml文档不太熟悉,也没有好的转换算法。
请问各位高手该怎么设计表?如何将解析出来的节点自动的存到对应的表中?用什么方法解析xml比较好?有现成的例子最好,可以的话追加多少分不是问题~~
你说的是用SQL Sever的函数?我得用Java编程实现啊。不建表那怎么插入xml结点呢?

分无所谓,如果是你要的看着给吧。不知道你了解多少,我就尽量详细点,罗嗦点。
表的设计完全是根据XML节点设计的,每一个节点信息都是表的一个字段,每一个节点的属性也要是一个表的字段。
如果是用java写首先需要导入几个包
import java.sql.*; //估计一般的项目都是外包连接数据库,所以用外包数据库来讲。
import java.io.*;
import javax.xml.parsers.*; //这个包是用来解析XML的
import org.w3c.dom.*; //工厂包
import org.apache.crimson.tree.*;//这个包是建立XML的包,也可以选择不用,一般IDE不自带,需要自己导入

//类也简单写一下吧
public class XmlToSql
public static void main(string[] args)

//根据XML节点设计出的表字段,我先假设有3个字段
String id,username,password;
//建立数据库连接,简单方法连一下吧

Class.forName("com.microsoft.jabc.sqlserver.SQLServerDriver");
Connection con=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;databasename="数据库名","登陆名","密码");
//建立了连接后要用工厂去获得Document,也就是你的XML
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();//建立一个新工厂
DocumentBuilder builder=factory.newDocumentBuilder();//工厂建立一个builder来管理Doc
Document doc=builder.parse(new FileInputStrem(new File("*****.xml"));//把你的XML进行解析放入Document类型文档。这时候你的XML文档节点就以树的形式放入内存了(说白了就是你表的字段),下面你要什么就调用就行了。

//开始正式解析文档
NodeList nodes=doc.getElementsByTagName("a");//从英文也看的出这是把名为a的节点的信息放入NodeList容器中。NodeList就是存放节点组的容器
for(int i=0;i<nodes.getLength(),i++) //开始循环把你的节点信息插入你的SQL表中,我只需要把你要的字段提取出来就行了。我们不是前面假定了一个属性ID,两个元素节点吗?这里就来取出
Element node=(Element)nodes.item(i); //先做个元素对象,毕竟我们要的字段都是元素节点
id=node.getAttributes().getNamedItem("id").getNodeValue(); //用这个方法取出XML中 属性ID的内容放入ID字段中,这个ID就是你SQL里的ID名了,最后插入就可以了。注意这里是提取属性的方法
username=node.getElementsBtagName("username").item(0).getFirstChild().getNode.Value();//提取元素节点username的值放入字段,.item(0)就是第一个这个字段,如果就有一个可以不要。
password=node.getElementsBtagName("password").item(0).getFirstChild().getNode.Value();//都是元素节点,所以同样的方法取出password的值

//好了我们要的3个表值都取到了,并放入了变量中。现在一个SQL语句插入表就行了,其实我很怕在JAVA中写SQL,不能格式化, .NET就方便的多。都写到这里了就写完吧

sql="insert into a values("+id+"','"+username+"'+'"password+"')";
con.createStatement().executeUpdate(sql);

catch(Exception ee.printStackTrace();




//好了,你的XL信息循环插入表中了,其实XML结构很关键,这里是但节点循环,有时候出现多子节点,或者非正规体那就要根据XML的结构来循环输入了,不过大体方法和思路都是一样的。由于直接就在这里写的代码,没在IDE中写,所以括号匹配方面也许会出小问题,见谅
参考技术A 分无所谓,如果是你要的看着给吧。不知道你了解多少,我就尽量详细点,罗嗦点。
表的设计完全是根据XML节点设计的,每一个节点信息都是表的一个字段,每一个节点的属性也要是一个表的字段。
如果是用java写首先需要导入几个包
import
java.sql.*;
//估计一般的项目都是外包连接数据库,所以用外包数据库来讲。
import
java.io.*;
import
javax.xml.parsers.*;
//这个包是用来解析XML的
import
org.w3c.dom.*;
//工厂包
import
org.apache.crimson.tree.*;//这个包是建立XML的包,也可以选择不用,一般IDE不自带,需要自己导入
//类也简单写一下吧
public
class
XmlToSql
public
static
void
main(string[]
args)
//根据XML节点设计出的表字段,我先假设有3个字段
String
id,username,password;
//建立数据库连接,简单方法连一下吧
Class.forName("com.microsoft.jabc.sqlserver.SQLServerDriver");
Connection
con=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;databasename="数据库名","登陆名","密码");
//建立了连接后要用工厂去获得Document,也就是你的XML
DocumentBuilderFactory
factory=DocumentBuilderFactory.newInstance();//建立一个新工厂
DocumentBuilder
builder=factory.newDocumentBuilder();//工厂建立一个builder来管理Doc
Document
doc=builder.parse(new
FileInputStrem(new
File("*****.xml"));//把你的XML进行解析放入Document类型文档。这时候你的XML文档节点就以树的形式放入内存了(说白了就是你表的字段),下面你要什么就调用就行了。
//开始正式解析文档
NodeList
nodes=doc.getElementsByTagName("a");//从英文也看的出这是把名为a的节点的信息放入NodeList容器中。NodeList就是存放节点组的容器
for(int
i=0;i<nodes.getLength(),i++)
//开始循环把你的节点信息插入你的SQL表中,我只需要把你要的字段提取出来就行了。我们不是前面假定了一个属性ID,两个元素节点吗?这里就来取出
Element
node=(Element)nodes.item(i);
//先做个元素对象,毕竟我们要的字段都是元素节点
id=node.getAttributes().getNamedItem("id").getNodeValue();
//用这个方法取出XML中
属性ID的内容放入ID字段中,这个ID就是你SQL里的ID名了,最后插入就可以了。注意这里是提取属性的方法
username=node.getElementsBtagName("username").item(0).getFirstChild().getNode.Value();//提取元素节点username的值放入字段,.item(0)就是第一个这个字段,如果就有一个可以不要。
password=node.getElementsBtagName("password").item(0).getFirstChild().getNode.Value();//都是元素节点,所以同样的方法取出password的值
//好了我们要的3个表值都取到了,并放入了变量中。现在一个SQL语句插入表就行了,其实我很怕在JAVA中写SQL,不能格式化,
.NET就方便的多。都写到这里了就写完吧
sql="insert
into
a
values("+id+"','"+username+"'+'"passw
查看原帖>>
参考技术B 导入如果文档不大的话可以用openxml函数来实现.select * into <tablename> from openxml() with()这样就行了,表不用先行定义。有问题可以M我

JaveScript 中使用 XSLT转换XML文档

我们经常将数据存储在XML 中,在展示的时候需要转换为其它的形式,这里介绍使用XSLT 对XML数据进行转换。要学习XSLT对XML的转换,需要先了解三个文件。

第一个是存储数据的XML文件:employees.xml

<?xml version="1.0"?>
<employees>
    <employee title="Software Engineer">
        <name>Nicholas C. Zakas</name>
    </employee>
    <employee title="Salesperson">
        <name>Jim Smith</name>
    </employee>
</employees>

  

 

第二个是存储XSLT的文件:employees.xslt

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="html" />
    
    <xsl:template match="/">
       <ul>
           <xsl:apply-templates select="*" />
       </ul>
    </xsl:template>

    <xsl:template match="employee">
        <li><xsl:value-of select="name" />, <em><xsl:value-of select="@title" /></em></li>
    </xsl:template>

</xsl:stylesheet>

  

 

第三个是我们进行转换的代码example.htm:

<!DOCTYPE html>
<html>
<head>
    <title>XSLTProcessor Example</title>   

    <script type="text/JavaScript">
        window.onload = function () {
        
            //use XHR to load
            var xmlhttp = new XMLHttpRequest();
            xmlhttp.open("get", "employees.xml", false);
            xmlhttp.send(null);
            var xmldom = xmlhttp.responseXML;
            
            xmlhttp = new XMLHttpRequest();
            xmlhttp.open("get", "employees.xslt", false);
            xmlhttp.send(null);
            var xsltdom = xmlhttp.responseXML;  

            var processor = new XSLTProcessor();
            processor.importStylesheet(xsltdom);

            var result = processor.transformToDocument(xmldom);
            var div = document.getElementById("divResult");
            
            var xml = (new XMLSerializer()).serializeToString(result);
            alert(xml);
            div.innerhtml = xml;

        }
    </script>           
</head>
<body>
    <p>This example loads employees.xml and transforms it using employees.xslt. 
    The resulting code is then displayed.</p>
    <div id="divResult"></div>
</body>
</html>

  

资源网站大全 https://55wd.com 我的007办公资源网站 https://www.wode007.com

在这里我们通过 XSLTProcessor 类型使用XSLT转换XML文档,第一步加载两个DOM文档,一个基于XML,另一个基于XSLT,下面的代码在Edge 中可以顺利执行,在Chrome中,因为禁止从本地装载文件随意会会失败,如果从网络服务器上读取数据则没有问题。

//use XHR to load
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("get", "employees.xml", false);
xmlhttp.send(null);
var xmldom = xmlhttp.responseXML;
            
xmlhttp = new XMLHttpRequest();
xmlhttp.open("get", "employees.xslt", false);
xmlhttp.send(null);
var xsltdom = xmlhttp.responseXML;  

  

 

然后创建一个新XSLTProcessor对象,并使用importStylesheet()方法为其指定一个XSLT

var processor = new XSLTProcessor();
processor.importStylesheet(xsltdom);

  

 最后一步是执行转换,这一步有两种不同的方式,如果想返回一个完整的DOM文档,可以调用transformToDocument().而通过调用transforToFragment()则可以得到一个文档片段对象。一般来说。使用transformToFragment()的唯一理由,就是你想把返回的结果添加到另一个DOM文档中。

在使用transforToDocument()时,只要传入XML DOM,就可以将结果作为一个完全不同的DOM文档来使用。来看例子

var result = processor.transformToDocument(xmldom);

  

我们将result 结果进行序列化

var xml = (new XMLSerializer()).serializeToString(result);

  

来看转换后的结果

<ul>
<li>Nicholas C. Zakas, <em>Software Engineer</em></li>
<li>Jim Smith, <em>Salesperson</em></li>
</ul>

  

下面我们来看一下XSLT中的定义:

下面的这段代码会让我们将所有的内容都放到<ul></ul>之中,之所以会这样是因为我们的选择符指定了全部 select="*"

<xsl:template match="/">
       <ul>
           <xsl:apply-templates select="*" />
       </ul>
</xsl:template>

  

下面这段代码的含义是对 employee 元素进行转换 match="employee"

将name 元素放到<li></li>中  select="name"

将title 属性提取出来放到<em></em>中  select="@title"

 <xsl:template match="employee">
        <li><xsl:value-of select="name" />, <em><xsl:value-of select="@title" /></em></li>
</xsl:template>

  

 

而transformToFragment()方法接收两个参数:要转换的XML DOM 和应该拥有结果片段的文档。换句话说,如果你想将返回的片段插入到页面中,只要将document作为第二个参数即可。

我们只需要将example.htm中 23 - 28 行代码替换成下面代码就可以了。

var fragment = processor.transformToFragment(xmldom, document);
var div = document.getElementById("divResult");
            
div.appendChild(fragment);

  

这里,处理器创建了一个有document对象拥有的片段。这样,就可以将返回的片段添加到页面中已有的<div>元素中了。

在XSLT样式表的输出格式为"xml","html"的情况下,创建文档或文档片段会非常有用。

 

1.使用参数

XSLTProcessor 也支持使用 setParameter()来设置XSLT的参数,这个方法接收三个参数:命名空间URI,参数的内部名称和要设置的值。通常,命名空间URI都是null,而内部名称就是参数的名称。另外必须在调用transformToDocument()或transformToFragment()之前调用这个方法。来看例子

我们先看XSLT文件 employees2.xslt:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="html" />

    <xsl:param name="message" />
        
    <xsl:template match="/">
       <ul>
           <xsl:apply-templates select="*" />
       </ul>
       <p>Message: <xsl:value-of select="$message" /></p>
    </xsl:template>

    <xsl:template match="employee">
        <li><xsl:value-of select="name" />, <em><xsl:value-of select="@title" /></em></li>
    </xsl:template>

</xsl:stylesheet>

  

针对 example.htm的修改

第16行替换为

xmlhttp.open("get", "employees2.xslt", false);

  

第23 - 28替换为下面代码

processor.setParameter(null, "message", "Hello World!");

var fragment = processor.transformToFragment(xmldom, document);
var div = document.getElementById("divResult");
            
div.appendChild(fragment);     

  

我们看运行后的结果:通过转换将模板中的 $message变量替换成了我们传入的参数"Hello World!"

<div id="divResult"><ul>
<li>Nicholas C. Zakas, <em>Software Engineer</em></li>
<li>Jim Smith, <em>Salesperson</em></li>
</ul>
<p>Message: Hello World!</p>
</div>

  

技术图片

还有两个与参数有关的方法,getParamenter()和removeParamenter(),分别用于取得和一处当前参数的值。这两个方法都要接受命名空间参数和参数内部i名称。例如

var processor = new XSLTProcessor();
processor.importStylesheet(xsltdom);
processor.setParameter(null, "message", "Hello World!");

alert(processor.getParaeter(null,"message"));     //输出 “Hello World!"
processor.removeParameter(null,"message");

var fragment = processor.transformToFragment(xmldom, document);

  

这两个方法并不常用。

 

2.重置处理器

每个XSLTProcessor 的实例都可以重用,以便使用不同的XSLT样式表执行不同的转换。重置处理器时要调用reset()方法,这个方法会从处理器中移除所有的参数和样式表。然后,你就可以再次调用importStylesheet(),以加载不同的XSLT样式表,如下面的例子

var processor = new XSLTProcessor();
processor.importStylesheet(xsltdom);

//执行转换

processor.reset();
processor.importStylesheet(xsltdom2);

//在执行转换

  

在需要基于多个样式表进行转换时,重用一个XSLTProcessor可以节省内存。

以上是关于xml文档转换存储到sql sever数据库中的主要内容,如果未能解决你的问题,请参考以下文章

什么是XML文档?

将 XML 文档从 SQL SERVER 插入到 Oracle

JaveScript 中使用 XSLT转换XML文档

JaveScript 中使用 XSLT转换XML文档

在 SQL 中将 XML 文档转换为表格数据集的有效方法,因为随着 xml 的增长,交叉应用 xml 查询的性能呈指数级下降

38初识xml