Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
delphi中xml文件的编程问题_Xml_Delphi - Fatal编程技术网

delphi中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标记中输入的位置和语法(例如,或“

您好,我是一个初学者程序员,正在使用TXMLparser和Delphi来读取一个小的xml文件,这样我就可以理解它们是如何工作的

我在xml文件“parser.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>