Xpoint
   [напомнить пароль]

Как парсить с помощью TXMLDocument?

Метки: [без меток]
2007-05-12 14:57:16 [обр] malor[досье]
Можете привести пример парсинга XML-документа с числом уровней 3-4?
спустя 5 часов [обр] xxx+++(0/10)[досье]
А в чем проблема то? Чем парсите?
спустя 1 день 4 часа [обр] malor[досье]
сообщение промодерировано

Например такой XML-файл как распарсить ? -

<TagGlobe>       
    <Items>   
          <Item id="1">   
                <Name>Rodman</Name>       
                <Address>Москва</Address>       
          </Item>   
          <Item id="2">   
                <Name>Snowy</Name>       
                <Address>Питер</Address>       
         </Item>   
    </Items>       
</TagGlobe>

Такой код прокатит ? -

procedure TForm1.bbReadXMLClick(Sender: TObject);
var
  XMLDoc: TXMLDocument;
  Node,NodeSvc: IXMLNode;
  i,j:Integer;
begin
    CoInitialize(nil);   
    XMLDoc:= TXMLDocument.Create(nil);
    XMLDoc.LoadFromFile(ExtractFilePath(Application.ExeName)+'otvet.xml');  
    Node := XMLDoc.DocumentElement.ChildNodes[0];  // стал указывать на <Items> ?
       mmMemo.Lines.Add(Node.ChildNodes[0].Attributes['id']);
           // Node.ChildNodes[0].Attributes['id']  указывает на <Item id="1">?
       mmMemo.Lines.Add(Node.ChildNodes[0].ChildNodes[0].Text);
           // Node.ChildNodes[0].ChildNodes[0]  -  указывает на узел <Name>Rodman</Name> ?
       mmMemo.Lines.Add(Node.ChildNodes[0].ChildNodes[1].Text);
           // Node.ChildNodes[0].ChildNodes[0]  -  указывает на узел  <Address>Москва</Address>?        mmMemo.Lines.Add(Node.ChildNodes[1].Attributes['id']);
           // Node.ChildNodes[0].Attributes['id']  указывает на <Item id="2">?
       mmMemo.Lines.Add(Node.ChildNodes[1].ChildNodes[0].Text);
           // Node.ChildNodes[0].ChildNodes[0]  -  указывает на узел <Name>Snowy</Name> ?
       mmMemo.Lines.Add(Node.ChildNodes[1].ChildNodes[1].Text);   
           // Node.ChildNodes[0].ChildNodes[0]  -  указывает на узел <Address>Питер</Address>?
..... и т.д. .....
end ;
спустя 13 часов [обр] kuglik[досье]
В синтаксисе JScript
var Nodes = XMLDoc.selectNodes("//*/Item");
for(var i = 0; i < Nodes.length; i++) {
    var Node = Nodes[i];
    mmMemo.Lines.Add(Node.attributes.getNamedItem("id").text)
    mmMemo.Lines.Add(Node.childNodes(0).text)
    mmMemo.Lines.Add(Node.childNodes(1).text)
}
спустя 3 часа 30 минут [обр] malor[досье]
сообщение промодерировано
procedure TForm1.bbReadXMLClick(Sender: TObject);
var
  XMLDoc: TXMLDocument;
  Node,NodeSvc: IXMLNode;
  i,j:Integer;
begin
    CoInitialize(nil);
    XMLDoc:= TXMLDocument.Create(nil);
    XMLDoc.LoadFromFile(ExtractFilePath(Application.ExeName)+'otvet.xml');
    XMLDoc.Active := true ;
    Node := XMLDoc.DocumentElement.ChildNodes[0];
    ........  bla-bla-bla.................
end;

У меня на последней из приведенных строк выскакивает окошко с таким содержимым:

---------------------------
Debugger Fault Notification
---------------------------
Project C:\Program Files\Borland\Delphi7\Projects\XMLproga\MyXML.exe raised too many consecutive exceptions: 
'access violation at 0x00000000: read of address 0x00000000'. Process Stopped. Use Step or Run to continue.
---------------------------
OK   Help   
---------------------------

Что неправильно?

XML-файл:

<Provs_Lst>
        <Prov id="1">
            <name>Поставщик_1</name>
            <Prov_Svcs>
                <Svc id="1">
                      <Svc_Name>Вид_оплаты_1</Svc_Name>
                      <min_amount>1000</min_amount>
                 </Svc>
                 <Svc id="2">
                      <Svc_Name>Вид_оплаты_2</Svc_Name>
                      <min_amount>1000</min_amount>
                 </Svc>
            </Prov_Svcs>
        </Prov>
        <Prov id="5">
             .... аналогичное заполнение....
        </Prov>
<Provs_Lst>

Так понимаю, та злополучная строка должна ссылаться на блок <Prov id="1"> ... </Prov> ?

WinXP_sp2, Delphi 7

Powered by POEM™ Engine Copyright © 2002-2005