亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? xmlparse.pas

?? XML 精要 范例 解析封裝類庫
?? PAS
字號:
//------------------------------------------
//    名稱:XMLParse
//    功能:XML解析類庫
//    引入:xmldom, XMLIntf, msxmldom, XMLDoc, Classes, IdCoder, IdCoder3to4, IdCoderMIME, IdBaseComponent
//	  引出:無 
//    版本:1.0
//    作者:羅庚
//    時間:2004-01-05
//    說明: 改類用于簡化XML的解析工作, 但其有個限定, 只能解析不帶域的XML.而且不能直接解析如下格式的片斷
//  <XMLPackage>
//    <data id="1">
//       <row id="1" name="子藍" sex="男" age="24" duty="軟件工程師"/>
//       <row id="2" name="天使藍" sex="女" age="25" duty="商務經理"/>
//    </data>
//    <data id="2">
//       <row id="1" name="子藍" sex="男" age="24" duty="軟件工程師"/>
//       <row id="2" name="天使藍" sex="女" age="25" duty="商務經理"/>
//    </data>
//  </XMLPackage>
//  這是應為存在兩個<data>元素的實例, intRowIndex 只能用于區分strNodePath指定的最尾部的同名節點(如row元素), 而不能區分出樹枝(如<data id="2">這個節點)
//  但也不是說沒有辦法解析, 可以用 GetNode<data id="2"> 把 data 節點讀出, 然后再再手工解析. 或者可以考慮讓 GetNode 支持數組格式 ,如可以讓 strNodePath='Package.data[1].row[0]'這樣的格式.
//------------------------------------------

unit XMLParse;

interface
uses  XMLIntf,  XMLDoc, Classes,  IdCoderMIME ; // msxmldom,,xmldom,IdCoder, IdCoder3to4,IdBaseComponent
Type
   TXMLDOMEx = Class(TObject)
      private
        XMLDocument :IXMLDocument;
        strXMLFileName :String;
      public
        constructor Create( strFileName :String='' );
        destructor destory();
        function LoadXMLFile( strFileName :String ):Boolean;
        function GetNodeAttribute( strNodePath, strAttribute: String; var strValue: String; intRowIndex: Integer=0; const dep: Char='.'):Boolean;
        function GetNodeText( strNodePath :String; var strValue :String; intRowIndex :Integer=0 ; const dep: Char='.'):Boolean;
        function GetNodeStream( strNodePath :StrIng; var stmValue :TStream; intRowIndex :Integer=0 ; const strEncode :String='Base64';const dep: Char='.'):Boolean;
        function GetChridNodeCount( strParentNodePath, strChildNodeName: String; const dep: Char='.'): Integer;
        function GetNode( strNodePath: String; intRowIndex: Integer=0; const dep: Char='.'): IXMLNode;

   end;
implementation


{ TXMLDOMEx }
//---------------------------------------------------------------------------
// 名稱: Create
// 功能: 創建對象,建立IXMLDocument接口
// 輸入:strFileName :String=''  XML文件名
// 輸出:無
// 版本:1.0
// 作者:羅庚
// 時間:2004-01-03
//---------------------------------------------------------------------------
constructor TXMLDOMEx.Create(strFileName: String);
begin
  XMLDocument := TXMLDocument.Create( strFileName );

  XMLDocument.Active := True;
  strXMLFileName := strFileName;
end;

//---------------------------------------------------------------------------
// 名稱: GetChridNodeCount
// 功能: 獲取XML中節點strParentNodePath 的子節點 strChildNodeName 的個數
// 輸入:strParentNodePath 父節點名,默認使用.分割,如 XMLPackage.data.row;
//       strChildNodeName  要確定其個數的子節點, 默認為空, 表示確定所有父節點下的子節點個數
//       dep 路徑 strNodePath 分割符號, 默認為 . ,如 strNodePath='XMLPackage>data>row',則改屬性置為 >
// 輸出:Integer 找到的子節點個數
// 版本:1.0
// 作者:羅庚
// 時間:2004-01-03
//---------------------------------------------------------------------------
function TXMLDOMEx.GetChridNodeCount(strParentNodePath,
  strChildNodeName: String; const dep: Char='.'): Integer;
var XMLParentNode: IXMLNode;  //'XMLPackage.memo'
    iCount, i :Integer;
    
begin
  iCount := 0;
  XMLParentNode := GetNode( strParentNodePath, 0, dep );
  if not assigned( XMLParentNode ) then
  begin
    Result := -1; // 無效的父節點
    exit;
  end;

  if strChildNodeName = '' then
    Result := XMLParentNode.ChildNodes.Count
  else
  begin
    for i := 0 to XMLParentNode.ChildNodes.Count -1 do
    begin
      if XMLParentNode.ChildNodes.Nodes[i].NodeName = strChildNodeName then
        inc( iCount );
    end;
    Result := iCount;
  end;

end;

//---------------------------------------------------------------------------
// 名稱: GetNode
// 功能: 獲取XML中編號第intRowIndex個路徑為strNodePath的節點.
// 注意: 本類庫的主要限制也就在這, 就是intRowIndex只能對strNodePath尾部的節點有控制作用
// 輸入:strNodePath 節點名,默認使用.分割,如 XMLPackage.data.row;
//       intRowIndex 尾部節點的索引, 如在data節點中包含多個 row節點時, 這個參數說明獲取第幾個row節點(row[i]),默認為0
//       dep 路徑 strNodePath 分割符號, 默認為 . ,如 strNodePath='XMLPackage>data>row',則改屬性置為 >
// 輸出:IXMLNode 找到的節點, 沒有找到返回nil
// 版本:1.0
// 作者:羅庚
// 時間:2004-01-03
//---------------------------------------------------------------------------
function TXMLDOMEx.GetNode(strNodePath: String;  intRowIndex: Integer;
  const dep: Char): IXMLNode;
var XMLNode: IXMLNode;
    sltNodePath :TStrings;
    iNodePathCount, iNodePathIndex :Integer;
    bIsFoundChild :Boolean;

    i:Integer;
    strBeFoundNodeName :String;
begin
  sltNodePath:=TStringList.Create;
  sltNodePath.Delimiter:= dep;
  sltNodePath.DelimitedText:= strNodePath;

  // 獲取根節點
  iNodePathCount := sltNodePath.Count;
  iNodePathIndex := 0;
  XMLNode := XMLDocument.DocumentElement;
  // End .

  bIsFoundChild := XMLNode.NodeName = sltNodePath.Strings[ iNodePathIndex ];
  inc( iNodePathIndex );

  while bIsFoundChild and ( iNodePathIndex < iNodePathCount  )  do
  begin
    strBeFoundNodeName := sltNodePath.Strings[ iNodePathIndex ];
    // 遍歷所有的子節點, 從中查找下名為 strBeFoundNodeName 的節點.
    bIsFoundChild := False;
    for i:= 0 to XMLNode.ChildNodes.Count - 1 do
    begin
      // 當尋找到當前節點的子節點是本次要尋找的節點時候, 選擇往下層尋找還是本層尋找第intRowIndex個同名的節點
       if XMLNode.ChildNodes.Nodes[i].NodeName = strBeFoundNodeName then
       begin
         // 當還沒有到達strNodePath中指定的最后的節點時,繼續往下層遍歷
          if iNodePathIndex <> (iNodePathCount - 1) then
          begin
            bIsFoundChild := True;
            XMLNode := XMLNode.ChildNodes.Nodes[i];
            break;
          end
         // End .
          else
         // 當已經尋找到strNodePath中指定的最后的節點的時候,控制往下尋找第 intRowIndex 個名為 strBeFoundNodeName 節點
          begin
            Dec( intRowIndex );
            if intRowIndex < 0 then
            begin
              bIsFoundChild := True;
              XMLNode := XMLNode.ChildNodes.Nodes[i];
              break;
            end;
          end;
          // End .
       end;
      // End . 
    end;
    // End . 結束尋找子節點.
    inc( iNodePathIndex );
  end;
  // end of while

  if bIsFoundChild then
    Result := XMLNode
  else
    Result := nil;
end;

//---------------------------------------------------------------------------
// 名稱: GetNodeAttribute
// 功能: 獲取XML中編號第intRowIndex個路徑為strNodePath的節點的屬性 strAttribute.
// 輸入:strNodePath 節點名,默認使用.分割,如 XMLPackage.data.row;
//       strAttribute 要獲取的屬性名稱, 區分大小寫
//       strValue     輸出的屬性值
//       intRowIndex 尾部節點的索引, 如在data節點中包含多個 row節點時, 這個參數說明獲取第幾個row節點(row[i]),默認為0
//       dep 路徑 strNodePath 分割符號, 默認為 . ,如 strNodePath='XMLPackage>data>row',則改屬性置為 >
// 輸出:boolean 成功返回true, false 表示無效的節點或者屬性
// 版本:1.0
// 作者:羅庚
// 時間:2004-01-03
//---------------------------------------------------------------------------
function TXMLDOMEx.GetNodeAttribute(strNodePath, strAttribute: String;
  var strValue: String; intRowIndex: Integer=0; const dep: Char='.'): Boolean;
var XMLNode: IXMLNode;  
begin
  XMLNode := GetNode( strNodePath, intRowIndex, dep );
  Result := True;
  if ( not assigned( XMLNode )) or ( not XMLNode.HasAttribute( strAttribute )) then
  begin
    Result := False;      // 無效的節點或者屬性
    strValue := '';
  end
  else
  begin
    strValue := XMLNode.Attributes[ strAttribute ];
  end;
end;

//---------------------------------------------------------------------------
// 名稱: GetNodeText
// 輸入:strNodePath 節點名,默認使用.分割,如 XMLPackage.data.row;
//       strValue    改節點包含的Text
//       intRowIndex 尾部節點的索引, 如在data節點中包含多個 row節點時, 這個參數說明獲取第幾個row節點(row[i]),默認為0
//       dep 路徑 strNodePath 分割符號, 默認為 . ,如 strNodePath='XMLPackage>data>row',則改屬性置為 >
// 輸出:1. true      成功返回
//       2. false     無效的節點或者該節點不能包括單獨的Text
// 版本:1.0
// 作者:羅庚
// 時間:2004-01-03
//---------------------------------------------------------------------------
function TXMLDOMEx.GetNodeText(strNodePath :String; var strValue :String;
     intRowIndex :Integer=0 ; const dep: Char='.'): Boolean;
var XMLNode: IXMLNode;
begin
  XMLNode := GetNode( strNodePath, intRowIndex, dep );
  Result := True;
  if ( not assigned( XMLNode )) or (not XMLNode.IsTextElement )  then
  begin
    Result := False;      // 無效的節點或者該節點不能包括單獨的Text
    strValue := '';
  end
  else
  begin
    strValue := XMLNode.Text;
  end;
end;

//---------------------------------------------------------------------------
// 名稱: GetNodeStream
// 輸入:strNodePath 節點名,默認使用.分割,如 XMLPackage.data.row;
//       strStrem     輸出的DecodeBase64流
//       intRowIndex 尾部節點的索引, 如在data節點中包含多個 row節點時, 這個參數說明獲取第幾個row節點(row[i]),默認為0
//       strEncode   Decode的代碼格式, 這個類庫只支持 Base64, 但可以擴充.
//       dep 路徑 strNodePath 分割符號, 默認為 . ,如 strNodePath='XMLPackage>data>row',則改屬性置為 >
// 輸出:1. true      成功返回
//       2. false     無效的節點或者該節點不能包括單獨的Text
// 版本:1.0
// 作者:羅庚
// 時間:2004-01-03
//---------------------------------------------------------------------------
function TXMLDOMEx.GetNodeStream(strNodePath: StrIng;
  var stmValue: TStream; intRowIndex: Integer;
  const strEncode: String; const dep: Char): Boolean;
var strText :String;
    DecodeBase64: TIdDecoderMIME;
begin
   stmValue.Size := 0;
   stmValue.Position := 0;
  if not GetNodeText( strNodePath, strText, intRowIndex, dep ) then
  begin
    Result := False;     // 無效的節點或者該節點不能包括單獨的Text
    exit;
  end;

  DecodeBase64 := TIdDecoderMIME.Create(nil);
  DecodeBase64.DecodeToStream( strText, stmValue );
  DecodeBase64.Free;
end;

//---------------------------------------------------------------------------
// 名稱: LoadXMLFile
// 功能: 載入一個XML文件
// 輸入:strFileName XML的文件名
// 輸出:1. true      成功返回
//       2. false     讀取失敗或者解析失敗
// 版本:1.0
// 作者:羅庚
// 時間:2004-01-03
//---------------------------------------------------------------------------
function TXMLDOMEx.LoadXMLFile(strFileName: String): Boolean;
begin
  XMLDocument.Active := False;
  XMLDocument.LoadFromFile( strFileName );
  XMLDocument.Active := True;
end;

//---------------------------------------------------------------------------
// 名稱: destory
// 功能: 類銷毀時, 撤銷所有對象
// 輸入:無
// 輸出:無
// 版本:1.0
// 作者:羅庚
// 時間:2004-01-03
//---------------------------------------------------------------------------
destructor TXMLDOMEx.destory;
begin
  if assigned( XMLDocument ) then
  begin
    // XMLDocument._Release;         這句語句倒不一定需要, 這里只是為了保險.
    XMLDocument := nil;
  end
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
天天免费综合色| 久久人人爽人人爽| 亚洲美女一区二区三区| 91视频在线观看免费| 亚洲欧美另类久久久精品| av成人老司机| 亚洲国产精品久久一线不卡| 欧美日韩一区二区三区四区 | 这里是久久伊人| 婷婷久久综合九色国产成人| 欧美成人vps| 国产成人无遮挡在线视频| 国产精品午夜在线| 91精品91久久久中77777| 亚洲国产精品精华液网站| 6080日韩午夜伦伦午夜伦| 久久电影国产免费久久电影| 国产精品视频免费| 91成人在线免费观看| 无码av中文一区二区三区桃花岛| 91精品国产综合久久蜜臀| 国产精品一区二区在线观看不卡| 成人免费一区二区三区在线观看 | 国产精品久久影院| 综合久久给合久久狠狠狠97色| 欧美在线综合视频| 视频一区中文字幕| 26uuu久久综合| www.在线欧美| 美女视频黄 久久| 国产精品久久久久aaaa樱花 | 成人性生交大片免费看中文| 亚洲无线码一区二区三区| 欧美大片在线观看一区二区| 99久久精品情趣| 蜜臀av在线播放一区二区三区| 国产精品网友自拍| 日韩一级片网址| 99精品一区二区三区| 秋霞午夜鲁丝一区二区老狼| 国产精品短视频| 日韩视频永久免费| 色婷婷亚洲婷婷| 国产一区二区三区电影在线观看 | 精品剧情在线观看| 91碰在线视频| 国产成人在线色| 热久久国产精品| 一区二区三区成人在线视频| 亚洲精品一线二线三线| 欧美性猛交一区二区三区精品| 国产精品中文有码| 日韩国产精品久久| 国产欧美精品一区| 欧美大片免费久久精品三p| 在线精品视频小说1| 国产成人啪免费观看软件| 丝袜国产日韩另类美女| 亚洲三级电影全部在线观看高清| 国产三级精品视频| 日韩欧美成人午夜| 欧美精品在线一区二区| 波多野结衣亚洲一区| 精久久久久久久久久久| 日本亚洲免费观看| 亚洲在线视频网站| 中文字幕中文字幕中文字幕亚洲无线| 26uuu久久综合| 欧美精品一区视频| 日韩一二在线观看| 欧美福利视频一区| 欧美精品一卡二卡| 欧美日韩一本到| 欧美欧美欧美欧美首页| 欧洲精品中文字幕| 91黄色激情网站| 欧美三级电影在线看| 欧美三级中文字幕| 欧美日韩色一区| 欧美视频中文字幕| 欧美午夜在线观看| 欧美午夜在线观看| 欧美卡1卡2卡| 日韩一区二区三区在线| 91精品国产综合久久久蜜臀粉嫩 | 日韩精品一区二区三区swag| 日韩欧美国产三级电影视频| 精品美女在线观看| 精品对白一区国产伦| 久久久久99精品一区| 中文字幕不卡一区| 国产精品福利一区二区三区| 亚洲欧美激情在线| 一区二区在线免费观看| 午夜精品爽啪视频| 日韩精品色哟哟| 国产露脸91国语对白| 国产精品一线二线三线| 丁香婷婷综合五月| 国产成人精品一区二区三区网站观看| 成人午夜激情在线| 色激情天天射综合网| 精品视频999| 欧美va亚洲va| 最新欧美精品一区二区三区| 亚洲综合免费观看高清完整版在线| 亚洲午夜激情网站| 精品一区二区三区影院在线午夜 | 天堂蜜桃一区二区三区| 麻豆国产欧美一区二区三区| 丰满少妇在线播放bd日韩电影| 成人a免费在线看| 欧美性色欧美a在线播放| 日韩午夜在线观看| 久久久精品综合| 一区二区在线观看视频| 美日韩一区二区| 成人高清视频在线| 欧美日韩一区二区三区四区五区| 欧美va亚洲va| 亚洲电影你懂得| 国产成人av在线影院| 欧美性一二三区| 久久久久国产一区二区三区四区| 亚洲一区二三区| 国产高清亚洲一区| 欧美日韩在线不卡| 久久精品欧美日韩精品 | 国产精品亲子乱子伦xxxx裸| 亚洲成精国产精品女| 美女视频第一区二区三区免费观看网站 | 99精品在线免费| 欧美大片国产精品| 亚洲综合激情另类小说区| 激情成人综合网| 欧美三级视频在线观看| 中文字幕av资源一区| 日韩成人av影视| 91黄色小视频| 亚洲欧美日韩电影| 国产乱妇无码大片在线观看| 欧美一区二区在线免费观看| 亚洲激情图片qvod| 国产精选一区二区三区| 欧美剧情片在线观看| 亚洲欧美国产高清| 成人免费黄色在线| 日韩免费一区二区三区在线播放| 亚洲伊人色欲综合网| 91网站最新地址| 中文字幕av一区二区三区免费看 | 成人免费不卡视频| 久久人人97超碰com| 首页综合国产亚洲丝袜| 99国产欧美另类久久久精品| 国产精品水嫩水嫩| 狠狠色丁香婷婷综合久久片| 91精品国产91久久久久久最新毛片| 亚洲国产精品一区二区久久恐怖片| 99国产精品久久久久久久久久| 国产性做久久久久久| 久久99精品国产.久久久久久| 678五月天丁香亚洲综合网| 亚洲黄色小视频| 色94色欧美sute亚洲线路一ni| 国产精品萝li| www.亚洲精品| 亚洲精选视频免费看| 91欧美一区二区| 亚洲精品视频在线看| 99久久免费视频.com| 国产精品污污网站在线观看 | 一本色道综合亚洲| 国产精品国产三级国产普通话99| 波多野结衣中文字幕一区| 国产欧美日产一区| gogogo免费视频观看亚洲一| 亚洲图片另类小说| 色素色在线综合| 日韩精品电影一区亚洲| 欧美一级高清片| 精品一区二区三区蜜桃| 久久久蜜臀国产一区二区| 国产尤物一区二区在线| 国产亚洲综合性久久久影院| 粉嫩久久99精品久久久久久夜| 国产精品久久久久永久免费观看 | 成人福利视频在线看| 国产精品第四页| 欧美日韩一区视频| 久久91精品国产91久久小草| 日本一区二区三区四区在线视频| 成人sese在线| 午夜电影一区二区三区| 日韩欧美电影一区| heyzo一本久久综合| 亚洲福利一二三区| 精品久久久久一区二区国产| www.66久久| 免费看欧美女人艹b|