delphi 关于如何截取字符串中的值的 头很大

火_v_舞 2017-09-05 10:15:25
字符串如下:
<?xml version="1.0" encoding="UTF-8"?>
<error></error>
<page rowcount='1' colcount='20'>
<row>
<d>23122613000163</d>
<d>测试单位</d>
<d>1203651676</d>
<d>232332197405060612</d>
<d>张三</d>
<d>1</d>
<d>1974-05-06</d>
<d>11</d>
<d>在职</d>
<d>62665679X</d>
<d>0.0</d>
<d>0.0</d>
<d>0.0</d>
<d>0.0</d>
<d>0.0</d>
<d>1312.12</d>
<d>498.57</d>
<d></d>
<d></d>
<d></d>
</row>
</page>
问题一、如何能取出<page rowcount='1' colcount='20'> 中的rowcount=1中的1,colcount中的20
问题二、如何能循环的把<row></row>中所有<d></d>中的值都一个个循环的取出来
谢谢高手指导
...全文
454 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyhoo163 2017-09-07
  • 打赏
  • 举报
回复
删除<error></error>,就是标准的XML格式了。结构如下: <?xml version="1.0"?> <page rowcount="1" colcount="20"> <row> <d>23122613000163</d> <d>测试单位</d> <d>1203651676</d> <d>232332197405060612</d> <d>张三</d> <d>1</d> <d>1974-05-06</d> <d>11</d> <d>在职</d> <d>62665679X</d> <d>0.0</d> <d>0.0</d> <d>0.0</d> <d>0.0</d> <d>0.0</d> <d>1312.12</d> <d>498.57</d> <d/> <d/> <d/> </row> </page>
xingnup 2017-09-07
  • 打赏
  • 举报
回复

//返回两个标志字符串之间的数字串
function SplitToNum(const sStr,BeginStr,EndStr:String):String;
var
  i,iBg,iEd,iNo:Integer;
  s:String;
begin
  iBg:=Pos(BeginStr,sStr);
  if iBg=0 then Exit;

  iEd:=iBg+Pos(EndStr,Copy(sStr,iBg,Length(sStr)-iBg+1))-1;
  if iEd=0 then iEd:=Length(sStr);
  if iEd<=iBg then Exit;

  s:=Copy(sStr,iBg,iEd-iBg+1);

  iBg:=0;
  iEd:=0;
  for i := 1 to Length(s) do
  begin
    iNo:=Ord(s[i]);
    if (iBg=0) And ((iNo=46) OR ((iNo>=48) AND (iNo<=57))) Then iBg:=i;
    if (iBg>0) AND (iNo<>46) AND ((iNo<48) OR (iNo>57)) Then iEd:=i;
    if (iBg>0) And (iEd>0) then Break;
  end;
  if (iBg>0) And (iEd>0) then
  begin
    s:=Copy(s,iBg,iEd-iBg);
    Result:=s;
  end
  else
    Result:='';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ListBox1.Items.Append(SplitToNum(memo1.Text,'rowcount=',' '));
  ListBox1.Items.Append(SplitToNum(memo1.Text,'colcount=','>'));
  ListBox1.Items.Append(SplitToNum(memo1.Text,'<d>','</d>'));
end;
xingnup 2017-09-07
  • 打赏
  • 举报
回复
//返回两个标志字符串之间的数字串 function SplitToNum(const sStr,BeginStr,EndStr:String):String; var i,iBg,iEd,iNo:Integer; s:String; begin iBg:=Pos(BeginStr,sStr); if iBg=0 then Exit; iEd:=iBg+Pos(EndStr,Copy(sStr,iBg,Length(sStr)-iBg+1))-1; if iEd=0 then iEd:=Length(sStr); if iEd<=iBg then Exit; s:=Copy(sStr,iBg,iEd-iBg+1); iBg:=0; iEd:=0; for i := 0 to Length(s) do begin iNo:=Ord(s[i+1]); if (iBg=0) And ((iNo=46) OR ((iNo>=48) AND (iNo<=57))) Then iBg:=i+1; if (iBg>0) AND (iNo<>46) AND ((iNo<48) OR (iNo>57)) Then iEd:=i+1; if (iBg>0) And (iEd>0) then Break; end; if (iBg>0) And (iEd>0) then begin s:=Copy(s,iBg,iEd-iBg); Result:=s; end else Result:=''; end; procedure TForm1.Button1Click(Sender: TObject); begin ListBox1.Items.Append(SplitToNum(memo1.Text,'rowcount=',' ')); ListBox1.Items.Append(SplitToNum(memo1.Text,'colcount=','>')); ListBox1.Items.Append(SplitToNum(memo1.Text,'<d>','</d>')); end;
wdonghai 2017-09-06
  • 打赏
  • 举报
回复

var
  gStr:string='<?xml version="1.0" encoding="UTF-8"?><error></error><page rowcount=''1'' colcount=''20''>'+
    '<row><d>23122613000163</d><d>测试单位</d><d>1203651676</d><d>232332197405060612</d>'+
    '<d>张三</d><d>1</d><d>1974-05-06</d><d>11</d><d>在职</d><d>62665679X</d><d>0.0</d>'+
    '<d>0.0</d><d>0.0</d><d>0.0</d><d>0.0</d><d>1312.12</d><d>498.57</d><d></d><d></d><d></d></row></page>';

function SpliteStr(ABTag,AETag:string;var AStr:string):string;
var
  iB,iE:Integer;
begin
  iB:=Pos(ABTag,AStr);
  iE:=Pos(AETag,AStr);
  result:=copy(AStr,ib+length(ABTag),ie-ib-length(ABTag));
  AStr:=Copy(AStr,iE+length(AETag),length(AStr));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  s,s2,sRowCount,sColCount:string;
  iB,iE:Integer;
begin
  iB:=pos('<page ',gStr);
  iE:=Pos('<row>',gStr);
  if iB=0 then exit;
  s:=Copy(gStr,iB+length('<page '),iE-iB);

  iB:=Pos('=''',s);
  iE:=Pos(''' ',s);
  sRowCount:=Copy(s,iB+2,iE-iB-2);

  s2:=Copy(s,iE,length(s));
  iB:=Pos('=''',s2);
  iE:=Pos('''>',s2);
  sColCount:=Copy(s2,iB+2,iE-iB-2);

  edit1.Text:=sRowCount;
  edit2.Text:=sColCount;
  s:=SpliteStr('<row>','</row>',gStr);
  iE:=StrToInt(sColCount);
  for iB:=1 to iE do
  begin
    memo1.Lines.Add(SpliteStr('<d>','</d>',s));
  end;
end;
lyhoo163 2017-09-06
  • 打赏
  • 举报
回复
非标准的XML。
lyhoo163 2017-09-06
  • 打赏
  • 举报
回复
1、使用 XMLDocument 对它进行解析。 2、你的 XML 结构有问题,层次不明。XML只能有一个根,你这里有多个根(Root)。

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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