проблемы программирования с XML-файлами в Delphi - PullRequest
0 голосов
/ 17 марта 2009

Привет, я начинающий программист, пытающийся использовать TXMLparser с Delphi, чтобы просто прочитать небольшой 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 ]

4 голосов
/ 18 марта 2009

Я не пользователь 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, и вы не можете рассматривать их как таковые. Попробуйте вместо этого:

rule := Parser.CurrAttr.Value('rule');
alert := Parser.CurrAttr.Value('alert');

На самом деле, теперь, когда я больше смотрю на опубликованный вами XML, вы вообще не имеете дело с атрибутами, а с контентом. Атрибуты будут иметь вид:

<rule name="My rule" priority="3" alert="Very important">Other stuff</rule>

Тем не менее, я оставлю этот пост только потому, что он объясняет синтаксическую ошибку, которую вы имели в отношении необъявленных идентификаторов.

3 голосов
/ 18 марта 2009

Несколько замечаний по коду:

  • пожалуйста, не используйте заглавные буквы для зарезервированных слов.
  • используйте try finally для созданных объектов
  • использовать дополнительные блоки начала / конца для вложенных сложных операторов
  • ты забыл конец; -)
  • использовать функции
  • попытаться использовать предложение else в операторе case

/

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 на их сайте .

2 голосов
/ 18 марта 2009

Цикл 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
1 голос
/ 18 марта 2009

Взгляните на использование встроенного в Delphi мастера XML Databinding Wizard. Он может создать строго типизированную оболочку класса вокруг XML / схемы, поэтому работать с XML так же просто, как и с любым другим объектом.

ех. rule.Alert: = 'Alert'; rule.Description: = 'Hello'; rule.Action: = 'beep';

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...