2013-06-07 8 views
1

Привет у меня есть XML, как этотЧитать все узлы XML

<?xml version="1.0" encoding="UTF-8"?> 
    <receipt> 
     <item></item> 
     <vat></vat> 
     <body> 
     <details> 
      <description>a</description> 
      <price></price> 
     </details> 
     <details> 
      <description>b</description> 
      <price></price> 
     </details> 
     </body> 
    </receipt> 

где подробно описывают одну строку квитанции.

Мне нужно прочитать все подробности.

я пытался с этим кодом:

EntryNode := xmldocument1.DocumentElement.ChildNodes['details']; 
for i := 0 to EntryNode.ChildNodes.Count do 
begin 
    text := EntryNode.ChildNodes[i]; 
    Break; 
end; 

, но я получить только первые данные тега.

Как я могу изменить свой код?

+0

Проверьте помощь для 'Break' –

ответ

3

Вы должны перебрать и проверить, то ChildNodes являются

var 
OuterRoot,EntryNode:IXmlNode; 
i,j:Integer; 
begin 
OuterRoot := xmldocument1.DocumentElement; 
for i := 0 to OuterRoot.ChildNodes.Count -1 do 
    begin 
    if OuterRoot.ChildNodes[i].NodeName='details' then 
     begin 
     Memo1.Lines.Add(StringOfChar('-',20)); 
     Memo1.Lines.Add(OuterRoot.ChildNodes[i].NodeName +':'); 
     EntryNode := OuterRoot.ChildNodes[i]; 
     for j := 0 to EntryNode.ChildNodes.Count -1 do 
     begin 
      Memo1.Lines.Add(EntryNode.ChildNodes[j].NodeName + '-' + EntryNode.ChildNodes[j].Text); 
     end; 
     end; 
    end; 
end; 
+0

Спасибо! Но я забыл часть xml, я отредактировал сообщение! – dvdan

+0

Я обновил свой код, он работает очень хорошо !! Спасибо чувак! – dvdan

+0

с обновленным кодом было бы OuterRoot: = xmldocument1.DocumentElement.ChildNodes ['body']; вместо // OuterRoot: = XMLDocument1.DocumentElement; – bummi

4

Чтение/Импорт

procedure importXml; 
    var 
     i: Integer; 
     TransUnits: IXMLNodeList; 
    begin 
     ListBox.Clear; 
     XMLDocument.LoadFromFile('C:\yourpath\demo.xml'); 
     if Assigned(XMLDocument) then 
     begin 
     TransUnits := XMLDocument.DocumentElement.ChildNodes['file'].ChildNodes['body'].ChildNodes; 

     for i := 0 to TransUnits.Count - 1 do 
      ListBox.Items.Add(TransUnits[I].Attributes['id'] + ' ' + TransUnits[i].ChildNodes['source'].Text + ' ' + TransUnits[i].ChildNodes['target'].Text); 
     end; 
     XMLDocument.Active; 
    end; 

Проверьте мой рабочий пример кода.

Запись/Экспорт

procedure WriteExport(Sender: TObject); 
var 
    source, target: String; 
    TargetNode: IXMLNode; 
    TransUnits: IXMLNodeList; 
begin 
    //XMLDocument.Encoding := 'UTF8'; 
    target := edTarget.Text; 
    TransUnits := XMLDocument.DocumentElement.ChildNodes['file'].ChildNodes['body'].ChildNodes; 

    TargetNode := TransUnits[ListBox.ItemIndex].ChildNodes.FindNode('target'); 

    //if not Assigned(TargetNode) then 
    // TargetNode := XMLDocument.DocumentElement.ChildNodes['file'].ChildNodes['body'].ChildNodes[ListBox.ItemIndex].AddChild('target'); Create 

    TargetNode.Text := target; 
    XMLDocument.SaveToFile('C:\export\demo.xml'); 
end; 
+0

Thank, я буду попробовать этот метод! – dvdan

+0

Только не C & P. U нужно отредактировать некоторые фразы/строки. Но этот 2 пример кода работает. – Hidden

Смежные вопросы