xml導入sql
分無所謂,如果是你要的看著給吧。不知道你了解多少,我就盡量詳細點,羅嗦點。
表的設計完全是根據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 e{e.printStackTrace();}
}
}
//好了,你的XL信息循環插入表中了,其實XML結構很關鍵,這里是但節點循環,有時候出現多子節點,或者非正規體那就要根據XML的結構來循環輸入了,不過大體方法和思路都是一樣的。由於直接就在這里寫的代碼,沒在IDE中寫,所以括弧匹配方面也許會出小問題,見諒
B. 將XML文件導入SQL
首先將XML拆解出來:
declare @變數名A XML
set @變數名A='XML內容COPY進來,如果有中文的話,在單引號前加 N '
declare @變數名B int
exec sp_xml_preparedocument @變數名B output,@變數名A
接下來就是把XML數據形成表在SQL裡面顯示出來= =:
舉個例子,
XML內容是:
<ROOT>
<Customer CustomerID="C01" Name="Samsung">
<Order OrderID="O01" Qty="1000">
<OrderDate>1998-1-1</OrderDate>
<Description>100 missing</Description>
</Order>
<Order OrderID="O02" Qty="200">
<OrderDate>2000-1-1</OrderDate>
<Description>10 smaller than specified size</Description>
</Order>
</Customer>
<Customer CustomerID="C02" Name="Nokia">
<Order OrderID="O03" Qty="500">
<OrderDate>2000-1-1</OrderDate>
<Description>Perfect this time</Description>
</Order>
<Order OrderID="O04" Qty="100"></Order>
</Customer>
</ROOT>
那麼你的代碼就應該這么打:
select*from
openxml(@變數名B,'/ROOT/Customer/Order',1)
with
(
訂單編號 char(3) '@OrderID',
數量 int '@Qty',
訂單日期 date 'OrderDate',
描述 varchar(30) 'Description'
)
with後面是表裡的內容,想要什麼就就打什麼,單引號內是你引用的東西。
最後釋放內存:
exec sp_xml_removedocument @變數名B
呃。。不懂再問把,
C. 怎樣把.xml的數據導入到SQL Server 2008中
bcp
bulk insert
都可以
bcp 實用工具可以在 Microsoft SQL Server 實例和用戶指定格式的數據文件間大容量復制數據。使用 bcp 實用工具可以將大量新行導入 SQL Server 表,或將表數據導入數據文件。
語法舉例:
bcp AdventureWorks.Sales.Currency2 in Currency.dat -T -f Currency.xml
程序裡面最好用這個。如果手動,管理器中導入就可以,用.net程序也可以,xml可以作為一個數據源操作。