📄 untxml.pas
字号:
unit untXml;
interface
uses
Messages, SysUtils, Variants, Classes, Controls, ComCtrls,
OleCtrls, SHDocVw, ExtCtrls, xmldom, XMLIntf, msxmldom, XMLDoc, untGlobal;
function LoginParze(strXml: string): TUser;
function getXmlNodeValue(xmlStream:TStream; xmlNodePath:String;
const xmlattrname:String=''; const dep:Char ='.'):String;
procedure GetNotify(strXml: string; ANotify: TList);
implementation
procedure GetNotify(strXml: string; ANotify: TList);
function GetNodeValue(childnodes:IXMLNodeList;nodename:String):string;
var
i: Integer;
begin
for i :=1 to childnodes.Count do begin
if UpperCase(childnodes.Get(i-1).NodeName) = UpperCase(nodename) then begin
result:= childnodes[i-1].Text;
exit;
end;
end;
end;
var
Notify: PNotify;
xmlDocument :IXMLDocument;
i: integer;
NodeList:IXMLNodeList;
xmlStream: TStream;
begin
xmlStream := TStringStream.Create(strXml);
xmlDocument :=TXMLDocument.Create(nil);
xmlDocument.LoadFromStream(xmlStream);
xmlDocument.Active:=true;
try
NodeList := xmlDocument.DocumentElement.ChildNodes[1].ChildNodes; //root.content.notify
for i := 0 to NodeList.Count - 1 do
begin
New(Notify);
Notify.ID := StrToInt(GetNodeValue(NodeList[i].ChildNodes, 'ID'));
Notify.UserID := StrToInt(GetNodeValue(NodeList[i].ChildNodes, 'UserID'));
Notify.Title := GetNodeValue(NodeList[i].ChildNodes, 'Title');
Notify.Content := GetNodeValue(NodeList[i].ChildNodes, 'Content');
Notify.Player := GetNodeValue(NodeList[i].ChildNodes, 'Player');
Notify.Action := GetNodeValue(NodeList[i].ChildNodes, 'Action');
Notify.Notify_Time := strtodatetime(GetNodeValue(NodeList[i].ChildNodes, 'NotifyTime'));
Notify.Notify_Type := StrToInt(GetNodeValue(NodeList[i].ChildNodes, 'NotifyType'));
Notify.Flag := StrToInt(GetNodeValue(NodeList[i].ChildNodes, 'Flag'));
ANotify.Add(Notify);
end;
except
end;
end;
function LoginParze(strXml: string): TUser;
var
xmlStream: TStream;
Status: string;
begin
try
xmlStream := TStringStream.Create(strXml);
Status := getXmlNodeValue(xmlStream, 'root.status');
if Status <> '0' then
begin
Result.Uid := 0;
Result.UserName := Status;
exit;
end;
Result.Uid := StrToInt(getXmlNodeValue(xmlStream, 'root.content.user.uid'));
Result.UserName := getXmlNodeValue(xmlStream, 'root.content.user.username');
Result.Password := getXmlNodeValue(xmlStream, 'root.content.user.password');
Result.Sex := StrToInt(getXmlNodeValue(xmlStream, 'root.content.user.sex'));
Result.Age := StrToInt(getXmlNodeValue(xmlStream, 'root.content.user.age'));
Result.Province := getXmlNodeValue(xmlStream, 'root.content.user.province');
Result.City := getXmlNodeValue(xmlStream, 'root.content.user.city');
Result.Level := getXmlNodeValue(xmlStream, 'root.content.user.level');
Result.Score := StrToInt(getXmlNodeValue(xmlStream, 'root.content.user.score'));
Result.LastLogin := getXmlNodeValue(xmlStream, 'root.content.user.lastlogin');
Result.LoginTimes := StrToInt(getXmlNodeValue(xmlStream, 'root.content.user.logintimes'));
Result.TipsType := getXmlNodeValue(xmlStream, 'root.content.user.tipstype');
except
Result.Uid := 0;
Result.UserName := '用户号码或密码错误';
end;
end;
{---------------------------------------------------------------------------------------------------
函数功能:直接读取xml文件中的某个节点第一次出现的值
入口参数:xmlFile xml文件
xmlnodepath 节点
xmlattrname 节点中的属性名称,如果直接取节点值则可以忽略此参数。
dep 节点的参数的分隔符,默认为.
返 回 值:末级点的值
}
function getXmlNodeValue(xmlStream:TStream; xmlNodePath:String;
const xmlattrname:String=''; const dep:Char ='.'):String;
function getnodefromIXMLNodeList(childnodes:IXMLNodeList;nodename:String):IXMLNode;
var
i: Integer;
begin
for i :=1 to childnodes.Count do begin
if(childnodes.Get(i-1).NodeName = nodename) then begin
result:= childnodes[i-1];
exit;
end;
end;
end;
var
xmlDocument :IXMLDocument;
node :IXMLNode;
xmlnodeList :TStrings;
i :Integer;
urlcount :Integer;
begin
//xml节点路径
xmlnodeList:=TStringList.Create;
xmlnodeList.Delimiter:=dep;
xmlnodeList.DelimitedText:=xmlnodepath;
urlcount:=xmlnodeList.Count;
//xml对象
xmlDocument :=TXMLDocument.Create(nil);
xmlDocument.LoadFromStream(xmlStream);
xmlDocument.Active:=true;
try
node:= xmlDocument.DocumentElement;
if(node.NodeName = xmlnodeList[0]) then begin
//扫描节点
for i := 1 to urlcount-1 do begin
if(node<>nil) then
node := getnodefromIXMLNodeList(node.ChildNodes,xmlnodeList[i])
else Break;
end;
if(node=nil)then begin
result:='';
end else begin
//判断是取属性还是取节点内容
if(Trim(xmlattrname)='') then
result:=node.Text
else
result:=node.AttributeNodes.Nodes[xmlattrname].NodeValue;
end;
end else begin
result:='';
end;
except
result:='error';
end;
xmlDocument.Active:=false;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -