您好我是一名初学程序员,使用Delphi的TXMLparser来读取一个小的xml文件,这样我就能理解它们是如何工作的。
我在xml文件'parser.xml'中有以下结构;
<rule>
<alert>priority 3</alert>
<desc> </desc>
<action>beep</action>
</rule>
我在delphi中有以下代码
VAR
Parser : TXmlParser;
rule, alert: string;
i:integer;
BEGIN
Parser := TXmlParser.Create;
Parser.Normalize := TRUE;
Parser.LoadFromFile ('c:\parser.xml');
Parser.StartScan;
WHILE Parser.Scan DO
CASE Parser.CurPartType OF
ptStartTag,
ptEmptyTag :
For i:=0 TO Parser.CurAttr.Count-1 Do
Begin
rule :=Parser.CurAttr.rule (i);
alert :=Parser.CurAttr.alert (i);
ptContent,
ptCData : // Process Parser.CurContent field here
ptEndTag : // Process End-Tag here (Parser.CurName)
ptPI : // Process PI here
// (Parser.CurName is the target, Parser.CurContent)
END;
Parser.Free;
end.
我不明白我在xml标签中输入的内容和语法(例如或“规则”或规则)。 我从XML网站获得了代码的基础,但FOR循环是我的。似乎工作正常,但规则和警报作为未声明的标识符返回,即使它们在VAR中设置
有关输入位置以及如何输入标签的任何帮助以及识别标识符的原因将不胜感激。
由于
答案 0 :(得分:4)
我不是TXMLParser的用户,但快速访问文档部分并FAQs page显示问题。
未声明标识符的问题不是因为你在vars部分声明的变量;它位于赋值右侧的循环中(参见以“// ****”注释结尾的行:
VAR
Parser : TXmlParser;
rule, alert: string;
i:integer;
BEGIN
Parser := TXmlParser.Create;
Parser.Normalize := TRUE;
Parser.LoadFromFile ('c:\parser.xml');
Parser.StartScan;
WHILE Parser.Scan DO
CASE Parser.CurPartType OF
ptStartTag,
ptEmptyTag :
For i:=0 TO Parser.CurAttr.Count-1 Do
Begin
rule := Parser.CurAttr.rule (i); // **** problem here with .rule
alert :=Parser.CurAttr.alert (i); // **** problem here with .alert
ptContent,
ptCData : // Process Parser.CurContent field here
ptEndTag : // Process End-Tag here (Parser.CurName)
ptPI : // Process PI here
// (Parser.CurName is the target, Parser.CurContent)
END;
Parser.Free;
end;
没有任何东西确立.rule()或.alert作为Parser.CurAttr的方法,你不能这样对待它们。试试这个:
rule := Parser.CurrAttr.Value('rule');
alert := Parser.CurrAttr.Value('alert');
实际上,现在我更多地关注您发布的XML,您根本不处理属性,而是处理内容。属性将遵循:
<rule name="My rule" priority="3" alert="Very important">Other stuff</rule>
不过,我会留下这篇文章,因为它解释了您对未申报标识符的语法错误。
答案 1 :(得分:3)
关于代码的几点评论:
/
procedure ProcessXML(const AFileName: string);
var
Parser : TXmlParser;
rule, alert : string;
i : Integer;
begin
Parser := TXmlParser.Create;
try
Parser.Normalize := TRUE;
Parser.LoadFromFile (AFileName);
Parser.StartScan;
while Parser.Scan do begin
case Parser.CurPartType of
ptStartTag,
ptEmptyTag : begin
for i := 0 to Parser.CurAttr.Count-1 do begin
rule :=Parser.CurAttr.rule (i);
alert :=Parser.CurAttr.alert (i);
end;
end;
ptContent,
ptCData : // Process Parser.CurContent field here
ptEndTag : // Process End-Tag here (Parser.CurName)
ptPI : // Process PI here
// (Parser.CurName is the target, Parser.CurContent)
else
// Do something
end;
//
finally
Parser.Free;
end;
end;
并调用函数:
begin
ProcessXML('c:\parser.xml');
end.
查找有关TXMLParser on their site的信息。
答案 2 :(得分:2)
for循环是你的问题(或其中之一):
ptEmptyTag :
For i:=0 TO Parser.CurAttr.Count-1 Do
Begin
rule :=Parser.CurAttr.rule (i);
alert :=Parser.CurAttr.alert (i);
end; // <-- Insert end here
ptContent,
ptCData : // Process Parser.CurContent field here
ptEndTag : // Process End-Tag here (Parser.CurName)
ptPI : // Process PI here
// (Parser.CurName is the target, Parser.CurContent)
end; // case
答案 3 :(得分:1)
看一下使用Delphi的内置XML数据绑定向导。它可以围绕XML /模式创建强类型类包装器,因此使用XML就像任何其他对象一样简单。
离。 rule.Alert:='警报'; rule.Description:='你好'; rule.Action:='beep';