Delphi XML解析

落幕年代 2015-09-11 11:09:56
XML数据格式
<?xml version="1.0" encoding="gb2312" ?>
- <!-- edited with XMLSPY v2004 rel. 4 U (http://www.xmlspy.com) by csssss (ORiON)
-->
- <ROOT>
- <JST_TCPARKIN>
- <DATA>
<MARKETID>05</MARKETID>
<SERIALNO>6683358</SERIALNO>
<INDATE>2015-1-25 1:30:36</INDATE>
<OUTDATE>2015-1-25 8:36:49</OUTDATE>
<VEHICLETYPENAME>aa</VEHICLETYPENAME>
<PAYTYPENAME>IC卡</PAYTYPENAME>
<INAMOUNT>0</INAMOUNT>
<OUTAMOUNT>0</OUTAMOUNT>
<ICCARDTYPENAME>bb</ICCARDTYPENAME>
</DATA>
- <DATA>
<MARKETID>05</MARKETID>
<SERIALNO>6683336</SERIALNO>
<INDATE>2015-1-25 6:05:39</INDATE>
<OUTDATE>2015-1-25 8:36:39</OUTDATE>
<VEHICLETYPENAME>aa</VEHICLETYPENAME>
<PAYTYPENAME>IC卡</PAYTYPENAME>
<INAMOUNT>0</INAMOUNT>
<OUTAMOUNT>0</OUTAMOUNT>
<ICCARDTYPENAME>bb</ICCARDTYPENAME>
</DATA>
怎么把 XML数据解析出来并保存到数据库
...全文
441 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
落幕年代 2015-09-18
  • 打赏
  • 举报
回复
引用 9 楼 lyhoo163 的回复:
[code=delphi]procedure TForm1.Button31Click(Sender: TObject);
大侠 您好 我现在有很多个XML文件 怎么用进行多线程进行解析XML文件。
tetsuya 2015-09-15
  • 打赏
  • 举报
回复
MARK 备用
缘中人 2015-09-14
  • 打赏
  • 举报
回复
数据确实很多,没比较过NativeXml、docxml两者性能的差距
lyhoo163 2015-09-14
  • 打赏
  • 举报
回复
NativeXml基本一样的,150000条数据读入是要花费时间的。
lyhoo163 2015-09-14
  • 打赏
  • 举报
回复
速度慢是通DBGrid写入,改成通过DataSet写入速度加快一些。但150000条数据读入是要花费时间的。
落幕年代 2015-09-14
  • 打赏
  • 举报
回复
引用 9 楼 lyhoo163 的回复:
procedure TForm1.Button31Click(Sender: TObject);
var A : array of array[0..8] of String;
    i,j,k,Top:integer;
    nodeList,nodeList1,nodeList2:IXMLNodeList;
    XMLRootNode,XMLnode1,XMLnode2,XMLnode3:IXMLNode;
    SQL:string;
begin
  XMLRootNode := XMLDocument1.DocumentElement;              // 根节点
  NodeList:=XMLRootNode.ChildNodes;                         // 第1级
  fOR I:=0 TO NodeList.Count-1 DO
  BEGIN
    XMLNode1:=NodeList.Get(i);
    if XMLNode1.NodeName='JST_TCPARKIN' then
    begin
      nodeList1:=XMLNode1.ChildNodes;                       // 第2级
      For j:=0 TO NodeList1.Count-1 DO
      begin
        XMLNode2:=NodeList1.Get(j);
        if XMLNode2.NodeName='DATA' then
        begin
          Top:=NodeList1.Count;
          SetLength(A, Top);
          nodeList2:=XMLNode2.ChildNodes;                   // 第3级
          For k:=0 TO NodeList2.Count-1 DO
          begin
            XMLNode3:=NodeList2.Get(k);
            A[j,k]:=XMLNode3.NodeValue;
          end;
        end;
      end;
    end;
  end;
  For i:=0 TO Top-1 DO
  begin
    DBGrid1.DataSource.DataSet.Append;
    For j:=0 TO 8 DO
    begin
      DBGrid1.DataSource.DataSet.FieldByName('MARKETID').AsString:=(A[i,0]);
      DBGrid1.DataSource.DataSet.FieldByName('SERIALNO').AsString:=(A[i,1]);
      DBGrid1.DataSource.DataSet.FieldByName('INDATE').AsString:=(A[i,2]);
      DBGrid1.DataSource.DataSet.FieldByName('OUTDATE').AsString:=(A[i,3]);
      DBGrid1.DataSource.DataSet.FieldByName('VEHICLETYPENAME').AsString:=(A[i,4]);
      DBGrid1.DataSource.DataSet.FieldByName('PAYTYPENAME').AsString:=(A[i,5]);
      DBGrid1.DataSource.DataSet.FieldByName('INAMOUNT').AsString:=(A[i,6]);
      DBGrid1.DataSource.DataSet.FieldByName('OUTAMOUNT').AsString:=(A[i,7]);
      DBGrid1.DataSource.DataSet.FieldByName('ICCARDTYPENAME').AsString:=(A[i,8]);
    end;
    DBGrid1.DataSource.DataSet.FieldByName('ID').AsString:=inttostr(1000+i);
    DBGrid1.DataSource.DataSet.Post;
  end;
  DBGrid_AutoSize(DBGrid1,aDataSource1);  // 不显示 ID
end;
完整代码,测试效果见上图。 注意你的XML文本中,有错误字符,需要修改。。
大侠 是不是用NativeXml会快些。
落幕年代 2015-09-14
  • 打赏
  • 举报
回复
引用 9 楼 lyhoo163 的回复:
XML文本中错误字符是哪里?我运行不了。
落幕年代 2015-09-14
  • 打赏
  • 举报
回复
引用 19 楼 lyhoo163 的回复:
if XMLNode3.NodeValue='' then 不就判断了吗!
明白了 谢谢大侠
落幕年代 2015-09-14
  • 打赏
  • 举报
回复
引用 19 楼 lyhoo163 的回复:
if XMLNode3.NodeValue='' then 不就判断了吗!
为空的字段怎么插入到数据库......提示类型不匹配?
lyhoo163 2015-09-14
  • 打赏
  • 举报
回复
if XMLNode3.NodeValue='' then
不就判断了吗!
落幕年代 2015-09-14
  • 打赏
  • 举报
回复
引用 15 楼 ksrsoft 的回复:
数据确实很多,没比较过NativeXml、docxml两者性能的差距
XML文件里面有的字段为空怎么判断?
落幕年代 2015-09-14
  • 打赏
  • 举报
回复
引用 14 楼 lyhoo163 的回复:
NativeXml基本一样的,150000条数据读入是要花费时间的。
XML 文件里面有的字段为空怎么判断? <?xml version="1.0" encoding="gb2312" ?> - <!-- edited with XMLSPY v2004 rel. 4 U (http://www.xmlspy.com) by csssss (ORiON) --> - <ROOT> - <JST_TCPARKIN> - <DATA> <MARKETID>05</MARKETID> <SERIALNO>6683358</SERIALNO> <INDATE>2015-1-25 1:30:36</INDATE> <OUTDATE>2015-1-25 8:36:49</OUTDATE> <VEHICLETYPENAME></VEHICLETYPENAME> <PAYTYPENAME></PAYTYPENAME> <INAMOUNT>0</INAMOUNT> <OUTAMOUNT>0</OUTAMOUNT> <ICCARDTYPENAME>bb</ICCARDTYPENAME> </DATA> - <DATA> <MARKETID>05</MARKETID> <SERIALNO>6683336</SERIALNO> <INDATE>2015-1-25 6:05:39</INDATE> <OUTDATE>2015-1-25 8:36:39</OUTDATE> <VEHICLETYPENAME></VEHICLETYPENAME> <PAYTYPENAME></PAYTYPENAME> <INAMOUNT>0</INAMOUNT> <OUTAMOUNT>0</OUTAMOUNT> <ICCARDTYPENAME>bb</ICCARDTYPENAME> </DATA> </JST_TCPARKIN> </ROOT>
落幕年代 2015-09-14
  • 打赏
  • 举报
回复
引用 15 楼 ksrsoft 的回复:
数据确实很多,没比较过NativeXml、docxml两者性能的差距
XML 文件里面有的字段为空怎么判断?
lyhoo163 2015-09-13
  • 打赏
  • 举报
回复
procedure TForm1.Button31Click(Sender: TObject);
var A : array of array[0..8] of String;
    i,j,k,Top:integer;
    nodeList,nodeList1,nodeList2:IXMLNodeList;
    XMLRootNode,XMLnode1,XMLnode2,XMLnode3:IXMLNode;
    SQL:string;
begin
  XMLRootNode := XMLDocument1.DocumentElement;              // 根节点
  NodeList:=XMLRootNode.ChildNodes;                         // 第1级
  fOR I:=0 TO NodeList.Count-1 DO
  BEGIN
    XMLNode1:=NodeList.Get(i);
    if XMLNode1.NodeName='JST_TCPARKIN' then
    begin
      nodeList1:=XMLNode1.ChildNodes;                       // 第2级
      For j:=0 TO NodeList1.Count-1 DO
      begin
        XMLNode2:=NodeList1.Get(j);
        if XMLNode2.NodeName='DATA' then
        begin
          Top:=NodeList1.Count;
          SetLength(A, Top);
          nodeList2:=XMLNode2.ChildNodes;                   // 第3级
          For k:=0 TO NodeList2.Count-1 DO
          begin
            XMLNode3:=NodeList2.Get(k);
            A[j,k]:=XMLNode3.NodeValue;
          end;
        end;
      end;
    end;
  end;
  For i:=0 TO Top-1 DO
  begin
    DBGrid1.DataSource.DataSet.Append;
    For j:=0 TO 8 DO
    begin
      DBGrid1.DataSource.DataSet.FieldByName('MARKETID').AsString:=(A[i,0]);
      DBGrid1.DataSource.DataSet.FieldByName('SERIALNO').AsString:=(A[i,1]);
      DBGrid1.DataSource.DataSet.FieldByName('INDATE').AsString:=(A[i,2]);
      DBGrid1.DataSource.DataSet.FieldByName('OUTDATE').AsString:=(A[i,3]);
      DBGrid1.DataSource.DataSet.FieldByName('VEHICLETYPENAME').AsString:=(A[i,4]);
      DBGrid1.DataSource.DataSet.FieldByName('PAYTYPENAME').AsString:=(A[i,5]);
      DBGrid1.DataSource.DataSet.FieldByName('INAMOUNT').AsString:=(A[i,6]);
      DBGrid1.DataSource.DataSet.FieldByName('OUTAMOUNT').AsString:=(A[i,7]);
      DBGrid1.DataSource.DataSet.FieldByName('ICCARDTYPENAME').AsString:=(A[i,8]);
    end;
    DBGrid1.DataSource.DataSet.FieldByName('ID').AsString:=inttostr(1000+i);
    DBGrid1.DataSource.DataSet.Post;
  end;
  DBGrid_AutoSize(DBGrid1,aDataSource1);  // 不显示 ID
end;
完整代码,测试效果见上图。 注意你的XML文本中,有错误字符,需要修改。。
落幕年代 2015-09-13
  • 打赏
  • 举报
回复
引用 9 楼 lyhoo163 的回复:
procedure TForm1.Button31Click(Sender: TObject);
var A : array of array[0..8] of String;
    i,j,k,Top:integer;
    nodeList,nodeList1,nodeList2:IXMLNodeList;
    XMLRootNode,XMLnode1,XMLnode2,XMLnode3:IXMLNode;
    SQL:string;
begin
  XMLRootNode := XMLDocument1.DocumentElement;              // 根节点
  NodeList:=XMLRootNode.ChildNodes;                         // 第1级
  fOR I:=0 TO NodeList.Count-1 DO
  BEGIN
    XMLNode1:=NodeList.Get(i);
    if XMLNode1.NodeName='JST_TCPARKIN' then
    begin
      nodeList1:=XMLNode1.ChildNodes;                       // 第2级
      For j:=0 TO NodeList1.Count-1 DO
      begin
        XMLNode2:=NodeList1.Get(j);
        if XMLNode2.NodeName='DATA' then
        begin
          Top:=NodeList1.Count;
          SetLength(A, Top);
          nodeList2:=XMLNode2.ChildNodes;                   // 第3级
          For k:=0 TO NodeList2.Count-1 DO
          begin
            XMLNode3:=NodeList2.Get(k);
            A[j,k]:=XMLNode3.NodeValue;
          end;
        end;
      end;
    end;
  end;
  For i:=0 TO Top-1 DO
  begin
    DBGrid1.DataSource.DataSet.Append;
    For j:=0 TO 8 DO
    begin
      DBGrid1.DataSource.DataSet.FieldByName('MARKETID').AsString:=(A[i,0]);
      DBGrid1.DataSource.DataSet.FieldByName('SERIALNO').AsString:=(A[i,1]);
      DBGrid1.DataSource.DataSet.FieldByName('INDATE').AsString:=(A[i,2]);
      DBGrid1.DataSource.DataSet.FieldByName('OUTDATE').AsString:=(A[i,3]);
      DBGrid1.DataSource.DataSet.FieldByName('VEHICLETYPENAME').AsString:=(A[i,4]);
      DBGrid1.DataSource.DataSet.FieldByName('PAYTYPENAME').AsString:=(A[i,5]);
      DBGrid1.DataSource.DataSet.FieldByName('INAMOUNT').AsString:=(A[i,6]);
      DBGrid1.DataSource.DataSet.FieldByName('OUTAMOUNT').AsString:=(A[i,7]);
      DBGrid1.DataSource.DataSet.FieldByName('ICCARDTYPENAME').AsString:=(A[i,8]);
    end;
    DBGrid1.DataSource.DataSet.FieldByName('ID').AsString:=inttostr(1000+i);
    DBGrid1.DataSource.DataSet.Post;
  end;
  DBGrid_AutoSize(DBGrid1,aDataSource1);  // 不显示 ID
end;
完整代码,测试效果见上图。 注意你的XML文本中,有错误字符,需要修改。。
大约有15W条数据;XMLDocument1 速度好慢 有什么办法提高效率的么?
Mr Dang 2015-09-12
  • 打赏
  • 举报
回复

uses
   XMLDoc,XMLIntf;

procedure TForm1.btn1Click(Sender: TObject);
var
    i,j,i_ParentNodeCount,i_DataNodeCount:Integer;
    Str_DataXML:string;
    XML_Doc:TXMLDocument;
    XML_RootNode,XML_ParentNode,XML_DataNode,XML_ItemNode:IXMLNode;
begin
    XML_Doc:=TXMLDocument.Create(Application);
    try
        XML_Doc.LoadFromXML(Str_DataXML);
        XML_Doc.Active:=True;
        XML_RootNode:=XML_Doc.DocumentElement;
        XML_ParentNode:=XML_RootNode.ChildNodes.FindNode('JST_TCPARKIN');   //这里也可以变成下面那样子的FOR
        if XML_ParentNode=nil then
        begin
            //Add your exception message code
            Exit;
        end;
        i_ParentNodeCount:=XML_ParentNode.ChildNodes.Count;
        if i_ParentNodeCount>0 then
        begin
            for i:=0 to i_ParentNodeCount-1 do
            begin
                XML_DataNode:=XML_ParentNode.ChildNodes[i];
                i_DataNodeCount:=XML_DataNode.ChildNodes.Count;
                if i_DataNodeCount>0 then
                begin
                    for j:=0 to i_DataNodeCount-1 do
                    begin
                        XML_ItemNode:=XML_DataNode.ChildNodes[j];
                        ShowMessage(XML_ItemNode.NodeName);
                        ShowMessage(XML_ItemNode.Text);
                    end;
                end;
            end;
        end;
    finally
        XML_Doc.Free;
    end;
end;
lyhoo163 2015-09-12
  • 打赏
  • 举报
回复
落幕年代 2015-09-11
  • 打赏
  • 举报
回复
引用 1 楼 lyhoo163 的回复:
建议使用XMLDocument控件,解析MXL数据,再传入DBGrid中。
大侠 具体是怎么做的 如果有多个XML文件 每个XML文件对应一个表 保存到数据库中?
落幕年代 2015-09-11
  • 打赏
  • 举报
回复
引用 2 楼 lyhoo163 的回复:
你的XML代码不完整,试过了。 <ROOT> <JST_TCPARKIN> 二节点没有关闭错误。即未有收尾的关键字。 应该贴出正确的文本。
嗯嗯 是的 如果要是数据量大用什么办法
lyhoo163 2015-09-11
  • 打赏
  • 举报
回复
你的XML代码不完整,试过了。 <ROOT> <JST_TCPARKIN> 二节点没有关闭错误。即未有收尾的关键字。 应该贴出正确的文本。
加载更多回复(3)

2,495

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧