2015-03-04 3 views
-2

У меня есть следующий XML.Читать xml url Delphi

<ArrayOfRapJ xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/pluriel.Models"> 
    <Rapj> 
    <Libdep>% Fréquentation:</Libdep> 
    <Total>36.860068259385665529010238910</Total> 
    </Rapj> 

Я использую следующий Delphi код для чтения значения <Libdep> и <Total>:

var 
    DOC: IXMLDocument; 
    i: Integer; 
    OrderChilds, E1EDP01_Node: IXMLNode; 
begin 
    DOC := LoadXMLDocument('d:\Rapjrnprests.xml'); 

    for i := 0 to DOC.ChildNodes.Nodes['ArrayOfRapJ'].ChildNodes.Count - 1 do 
    begin 
    OrderChilds := DOC.ChildNodes.Nodes['RapJ'].ChildNodes[i]; 
    if OrderChilds.NodeName = 'RapJ' then 
    begin 
     E1EDP01_Node := OrderChilds.ChildNodes.Nodes['Libdep']; 
     if Assigned(E1EDP01_Node) then 
     Memo1.Lines.Add(E1EDP01_Node.ChildNodes.Nodes['Total'].NodeValue) 
    end; 
    end; 

XML, используется URL пространства имен. Как читать значения?

+0

Это не массовое понимание того, что вы просите. Можете ли вы опубликовать любой код, который у вас есть? – GHC

+0

все сделано, спасибо :) – David

+0

Здравствуйте. Для справок в будущем вы всегда можете отредактировать свой собственный пост и добавить к нему любую дополнительную информацию. Ответы, ответы на которые не являются ответами, не одобряются. Во избежание сомнений, я ничего не знаю о Delphi - если ваш вопрос хорош (имеет правильную информацию во всех правильных местах), вы с большей вероятностью получите ответ от того, кто знает об этом типе вещей. – GHC

ответ

0

Ваш код не соответствует указанному в XML-документе, что не требует учета пространства имен.

Попробуйте что-то больше, как это вместо:

var 
    Doc: IXMLDocument; 
    i: Integer; 
    Arr, Node: IXMLNode; 
    Libdep, Total: string; 
begin 
    Memo1.Clear; 
    Doc := LoadXMLDocument('d:\Rapjrnprests.xml'); 

    // assuming <RapJArray> is the top-most element of the XML... 
    Arr := Doc.DocumentElement; 

    for i := 0 to Arr.ChildNodes.Count - 1 do 
    begin 
    Node := Arr.ChildNodes.Nodes[i]; 
    if (Node.NodeName = 'RapJ') {and (Node.NamespaceURI = 'http://schemas.datacontract.org/2004/07/pluriel.Models')} then 
    begin 
     Libdep := VarToStr(Node.ChildValues['Libdep']); 
     Total := VarToStr(Node.ChildValues['Total']); 
     if (Libdep <> '') and (Total <> '') then 
     Memo1.Lines.Add(Libdep + ' ' + Total); 
    end; 
    end; 
end; 
0

Для начала, у вас есть простая опечатка. XML чувствителен к регистру; ваш XML содержит (обратите внимание на нижний регистр j), в то время как ваш код содержит RapJ (обратите внимание на верхний регистр J). Код должен точно соответствовать XML.

У вас также есть неправильное обращение в коде. Вот (очень упрощенный) рабочий пример (протестирован в XE7).

// Used in order to avoid creating a disk file. XML unchanged from 
// question except for adding the closing </ArrayOfRapJ> element, 
// which was missing 

const 
    XMLText = '<ArrayOfRapJ xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/pluriel.Models">' + 
      ' <Rapj>' + 
      ' <Libdep>% Fréquentation:</Libdep>' + 
      ' <Total>36.860068259385665529010238910</Total>' + 
      ' </Rapj>' + 
      '</ArrayOfRapJ>'; 

procedure TForm5.Button1Click(Sender: TObject); 
var 
    Doc: IXMLDocument; 
    DocNode: IXMLNode; 
    Node: IXMLNode; 
    i: Integer; 
begin 
    Doc := LoadXMLData(XMLText); 
    DocNode := Doc.ChildNodes[0]; 

    for i := 0 to DocNode.ChildNodes.Count - 1 do 
    begin 
    Node := DocNode.ChildNodes[i]; 
    if Node.NodeName = 'Rapj' then 
    begin 
     Memo1.Lines.Add(Node.ChildNodes['Libdep'].Text); 
     Memo1.Lines.Add(Node.ChildNodes['Total'].Text); 
    end 
    else 
     Memo1.Lines.Add('Skipped node ' + Node.NodeName); 
    end; 
end;