第一个段的节点,我都能解析,但是下面<item id="0">....</item>中间的值,不知道该如何解析。

解决方案 »

  1.   

    找item的子节点。然后在里面按名字找。
      

  2.   

    这个我知道,能不能给我演示代码,我自己怎么都取不出来。
    childnodes取子节点列表
    nodes[节点名]取子节点
      

  3.   

    没用过XMLDocument,但是可以将这个XML读入到流中,然后定义两个指针来根据<和>来遍历该流。比较‘xh’这样的名字取出后续值。 你这里的<item id="0"> 如果要取ID的值, 可能要特殊处理下。大致如下:
    procedure TForm1.btn1Click(Sender: TObject);
      function SetXMLFormatStr(const AStr: string): string;
      begin
        Result := '';
        Result := '<' + AStr + '>';
      end;
    var
      tmpFilePath: string;
      tmpfilestream: TFileStream;
      tmpFileMemoryStream: TMemoryStream;
      buffer: array of char;
      p: PChar;
      pFlag, p0: PChar;
      tmpOffset: longword;
      tmpStr, tmpFieldNameStr, tmpvalue: string;
      tmpValueStr: array of string;
      tmpFileSize: Cardinal;
      tmpLen: Cardinal;
      I,J: Integer;
    begin
      opendlg.Filter := 'xml文件|*.XML';
      if opendlg.Execute then
      begin
        tmpFilePath := opendlg.FileName;
      end;
      Edit1.Text := tmpFilePath;
      
      tmpfilestream := TFileStream.Create(tmpFilePath, fmOpenRead or fmShareExclusive);
      try
         //获得filestream的大小
        //指针指向该stream,
        //按照格式循环取对应值;
        //赋值给array of string 数组;
        tmpfilestream.Position := 0;
        tmpFileSize := tmpFileStream.Size;
        SetLength(buffer, tmpFileSize);
        tmpFileStream.Read(buffer[0], tmpFileSize);
      finally
        FreeAndNil(tmpfilestream);
      end;
      mmo1.Lines.Add(PChar(buffer));  try    p := PChar(buffer);
        p0 := PChar(buffer);    while (p - p0) < tmpFileSize do
        begin
          while p^ in [#0..#32] do
            p := CharNext(p);
          //读文件头
          //读root部分
          //读item部分   //每个<item>之间存着数字部分  (循环读入)
          //进入实际的数值部分,进行""的提取;
          //读root部分
          //读item部分
          //读文件尾
          if p^ = '<' then  //如果是<item> ,那么就要取之间的内容;
          begin
            pFlag := p;  //记住这个位置,找对应的>        while p^ <> '>' do
              p := charnext(p);        if p^ = '>' then
            begin
              //获得 filedname;
              SetString(tmpFieldNameStr, pFlag,p - pFlag + 1);
              mmo2.lines.add(tmpFieldNameStr);
              for I := 0 to Length(cNodeFileNameArr) -1 do
              begin
                if tmpFieldNameStr = SetXMLFormatStr(cNodeFileNameArr[I]) then
                begin
                  p := charnext(p);
                  pFlag := p;
                  while p^ <> '<' do
                    p := charnext(p);
                  if p^ = '<' then
                  begin
                    SetString(tmpvalue, pFlag,p - pFlag);
                    mmo2.lines.add(tmpvalue);    //打印值;
                  end;
                  Break;
                end;
              end;
            end;        p := charnext(p);      end;      p := charnext(p);    end;  finally
        FreeAndNil(tmpfilestream);
      end;
    end;
      

  4.   

     cNodeFileNameArr: array[0..5] of string = ('syxz','syr','zzl','glbm','xh','sfyx');