xml如何导入到数据库中? ( 积分: 50 )

  • 主题发起人 bobby_ym
  • 开始时间
B

bobby_ym

Unregistered / Unconfirmed
GUEST, unregistred user!
返回一个XML标记字符串
<?xml version="1.0" encoding="GBK" ?>
- <Result time="12" error="0">
- <Center total="2">
- <Poi id="1">
<LSID v="123" />
<Na v="某某地名" />
<Add v="某某地址" />
<Tel v="电话" />
<Geo lo="经度" la="纬度" />
<Dis v="数字,单位百米" />
<Admin pro="省名" city="城市名" dis="子区划名" />
<Class g1="一级地物名" g2="二级地物名" g3="三级地物名" />
</Poi>
- <Poi id="2">
<LSID v="124" />
<Na v="某某地名" />
<Add v="某某地址" />
<Tel v="电话" />
<Geo lo="经度" la="纬度" />
<Dis v="数字,单位百米" />
<Admin pro="省名" city="城市名" dis="子区划名" />
<Class g1="一级地物名" g2="二级地物名" g3="三级地物名" />
</Poi>
</Center>
</Result>

请问怎么导入到数据库中?
 
高手在哪里呀,高手在哪里,高手是不是只在程序员的想象里?
 
读取XML 每个节点值.然后执行sql 就可以导入其中.没有什么其他更好的方法.
在网格上查找nativexml .simplexml 可以读取xml节点值 .
希望对你有帮助.
 
自己解析就是了,dephi提供了 相关的类啊
ixmldocument,ixmlNOde....
unit xmlToSqlUnt;

interface
uses XMLDoc,XMLIntf,ADODB;

procedure XmlToSql(FileName,ConStr: string);
procedure IniCon(conStr: string);
procedure FreeCon;
function GetTextFromFile(fileName: String): string;
function FindNodeByNodeName(aXMLNode: IXMLNode;NodeName: string): IXMLNode;
function GetMaxIndex: integer;
procedure InsertTable;

implementation
uses SysUtils,Classes, DB;

var
con: TADOConnection;
keyStrs,valueStrs: tstrings;

procedure IniCon(conStr: string);
begin
if not Assigned(con)then
con:= TADOConnection.Create(nil);
con.ConnectionString:= conStr;
con.Connected:= true;
if not Assigned(keyStrs)then
keyStrs:= TStringList.Create;
if not Assigned(valueStrs)then
valueStrs:= TStringList.Create;
end;

procedure FreeCon;
begin
if Assigned(con)then
FreeAndNil(con);
if Assigned(keyStrs)then
FreeAndNil(keyStrs);
if Assigned(valueStrs)then
FreeAndNil(valueStrs);
end;

function GetTextFromFile(fileName: String): string;
var
aXMLDoc: IXMLDocument;//接口生存期自管理
begin
aXMLDoc:=TXMLDocument.Create(nil);
try
aXMLDoc.LoadFromFile(fileName);
Result:= aXMLDoc.XML.Text;
except
raise Exception.Create('文件载入失败!');
end;
end;

function FindNodeByNodeName(aXMLNode: IXMLNode;NodeName: string): IXMLNode;
var
i: integer;
begin
Result:= nil;
if aXMLNode <> nil then
begin
for i:= 0 to aXMLNode.ChildNodes.Count-1 do
begin
if aXMLNode.ChildNodes.NodeName = NodeName then
begin
Result:= aXMLNode.ChildNodes;
Break;
end
else
Result:=FindNodeByNodeName(aXMLNode.ChildNodes,NodeName);
end;
end;
end;

function GetMaxIndex: integer;
var
aADOQuery: TADOQuery;
begin
Result:= 0;
aADOQuery:= TADOQuery.Create(nil);
try
aADOQuery.Connection:= con;
with aADOQuery do
begin
close;
SQL.Text:= 'select Max(jiva_Idx) from td_JobIdentityValue';
open;
if not IsEmpty then
Result:= Fields[0].AsInteger;
end;
finally
aADOQuery.Free;
end;
end;

procedure InsertTable;
var
aADOQuery,bADOQuery: TADOQuery;
i,MaxIndex: integer;
begin
MaxIndex:= GetMaxIndex;
aADOQuery:= TADOQuery.Create(nil);
bADOQuery:= TADOQuery.Create(nil);
try
aADOQuery.Connection:= con;
bADOQuery.Connection:= con;
bADOQuery.LockType:= ltBatchOptimistic;//批处理

with bADOQuery do //使得数据集处于open状态
begin
close;
SQL.Text:= 'select top 1 * from td_JobIdentityValue';
Open;
end;

for i:= 0 to keyStrs.Count-1 do
begin

with aADOQuery do
begin
close;
SQL.Text:= 'select jiva_Name,jiva_Value from td_JobIdentityValue where '
+ 'jiva_Name = '+ QuotedStr(keyStrs)+ ' and jiva_Value = '
+ QuotedStr(valueStrs);
open;

if IsEmpty then
begin
with bADOQuery do
begin
Inc(MaxIndex);//自增索引
Append;
FieldByName('jiva_BudgetCode').AsString:= '';
FieldByName('jiva_Name').AsString:= keyStrs;
FieldByName('jiva_Idx').AsInteger:= MaxIndex;
FieldByName('jiva_Value').AsString:= valueStrs;
post;
end;
end
else
begin
Continue;
end;
end;
end;
bADOQuery.UpdateBatch(arAll); //提交
finally
aADOQuery.Free;
bADOQuery.Free;
end;
end;

{===============================================================
核心函数 XmlToSql
===============================================================}
procedure XmlToSql(FileName,ConStr: string);
var
aXMLDoc: IXMLDocument; //接口生存期自管理
aXMLNode: IXMLNode;
i: integer;
begin
IniCon(ConStr);
aXMLDoc:= TXMLDocument.Create(nil);
try
aXMLDoc.XML.Text:= GetTextFromFile(FileName);;
aXMLDoc.Active:= true;//开始解析
aXMLNode:= FindNodeByNodeName(aXMLDoc.Node,'NewDataSet');
if aXMLNode <> nil then
begin
for i:= 0 to aXMLNode.ChildNodes.Count-1 do
begin
keyStrs.Add(aXMLNode.ChildNodes.Nodes.ChildNodes.Nodes[0].Text);
valueStrs.Add(aXMLNode.ChildNodes.Nodes.ChildNodes.Nodes[1].Text);
end;
InsertTable;//更新表
end;
finally
FreeCon;
aXMLDoc:= nil;
end;
end;

end.
 
DECLARE @idoc int
DECLARE @doc varchar(8000)
SET @doc ='
<?xml version="1.0" encoding="GBK" ?>
<Result time="12" error="0">
<Center total="2">
<Poi id="1">
<LSID v="123" />
<Na v="某某地名" />
<Add v="某某地址" />
<Tel v="电话" />
<Geo lo="经度" la="纬度" />
<Dis v="数字,单位百米" />
<Admin pro="省名" city="城市名" dis="子区划名" />
<Class g1="一级地物名" g2="二级地物名" g3="三级地物名" />
</Poi>
<Poi id="2">
<LSID v="124" />
<Na v="某某地名" />
<Add v="某某地址" />
<Tel v="电话" />
<Geo lo="经度" la="纬度" />
<Dis v="数字,单位百米" />
<Admin pro="省名" city="城市名" dis="子区划名" />
<Class g1="一级地物名" g2="二级地物名" g3="三级地物名" />
</Poi>
</Center>
</Result>
'

EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

SELECT *
FROM OPENXML (@idoc, '/Result/Center/Poi',2)
WITH (ID varchar(20)'@id',
LSID varchar(50)'LSID/@v',
Na varchar(50)'Na/@v',
Adds varchar(50)'Add/@v',
Tel varchar(50)'Tel/@v',
Geo varchar(50)'Geo/@lo',
Dis varchar(50)'Dis/@v',
Admin varchar(50)'Admin/@pro',
Class varchar(50)'Class/@g1')

EXEC sp_xml_removedocument @idoc
结果
1 123 某某地名 某某地址 电话 经度 数字,单位百米 省名 一级地物名
2 124 某某地名 某某地址 电话 经度 数字,单位百米 省名 一级地物名
 
自己去遍历。。也就一颗树。。。
 
那位高手能写一段读取某一节点的代码就可以
如读取 <Geo lo="经度" la="纬度" />
 
先要写程序将XML数据读出来,然后再写到你自己需要的数据库。这只是一种方法,但通用性强。
 
高手同志们,我对XML不熟悉,能不能给出一段代码

如读取 <Geo lo="经度" la="纬度" />
 

Similar threads

顶部