delphi中xml文件的编程问题
您好,我是一个初学者程序员,正在使用TXMLparser和Delphi来读取一个小的xml文件,这样我就可以理解它们是如何工作的 我在xml文件“parser.xml”中有以下结构:delphi中xml文件的编程问题,xml,delphi,Xml,Delphi,您好,我是一个初学者程序员,正在使用TXMLparser和Delphi来读取一个小的xml文件,这样我就可以理解它们是如何工作的 我在xml文件“parser.xml”中有以下结构: <rule> <alert>priority 3</alert> <desc> </desc> <action>beep</action> </rule> 我不明白在xml标记中输入的位置和语法(例如,或“
<rule>
<alert>priority 3</alert>
<desc> </desc>
<action>beep</action>
</rule>
我不明白在xml标记中输入的位置和语法(例如,或“rule”或rule)。
我从XML网站获得了代码的基础,但是FOR循环是我的。。看起来工作正常,但规则和警报作为未声明的标识符返回,即使它们是在VAR中设置的
如果您有任何关于在何处输入标签、如何输入标签以及为什么无法识别标识符的帮助,我们将不胜感激
谢谢for循环是您的问题(或其中之一):
ptEmptyTag:
对于i:=0到Parser.CurAttr.Count-1 Do
开始
规则:=Parser.CurAttr.rule(i);
alert:=Parser.CurAttr.alert(i);
完 仅对代码进行几点说明:
- 保留字请不要用大写
- 对创建的对象使用try finally
- 对嵌套的复杂语句使用额外的开始/结束块
- 你忘了结束;-)李>
- 使用函数
- 尝试在case语句中使用else子句
/
//
并调用函数:
begin
ProcessXML('c:\parser.xml');
end.
查找有关的信息。我不是TXMLParser的用户,但可以快速浏览文档部分并说明问题所在
未声明标识符的问题不是因为您在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的方法,您不能将其视为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>
其他东西
尽管如此,我还是会留下这篇文章,因为它解释了您在未声明标识符方面的语法错误。看看使用Delphi的内置XML数据绑定向导。它可以围绕XML/schema创建强类型类包装器,因此使用XML与任何其他对象一样简单
前。
规则.警报:='警报';
规则.说明:='Hello';
规则.操作:='beep';另一端是case语句,因此不应删除;-)编辑为重新标记,不带“gui”和“pascal”标记,因为这是Delphi特有的问题(不是一般的pascal),与图形用户界面完全无关。好的提示+1美元。我只是不喜欢在一行的末尾加上“开始”。在您的示例中,您清楚地看到了原因:您忘记了结束语'end;'匹配“while”。如果begin在一条新的线路上,你会在一个链接中看到它。虽然这可能是一个好的建议,但它并不是对所问问题的答案。XML数据绑定向导不是未声明标识符或使用TXMLParser的解决方案。
begin
ProcessXML('c:\parser.xml');
end.
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 := Parser.CurrAttr.Value('rule');
alert := Parser.CurrAttr.Value('alert');
<rule name="My rule" priority="3" alert="Very important">Other stuff</rule>