在delphi中使用xml文件编程时遇到麻烦

时间:2009-03-17 20:43:29

标签: xml delphi

您好我是一名初学程序员,使用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中设置

有关输入位置以及如何输入标签的任何帮助以及识别标识符的原因将不胜感激。

由于

4 个答案:

答案 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)

关于代码的几点评论:

  • 请不要使用大写字母作为保留字。
  • 最后使用try for created objects
  • 对嵌套复杂语句使用额外的开始/结束块
  • 你忘记了结束; - )
  • 使用功能
  • 尝试在案例陈述中使用else子句

/

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';