2012-04-12 2 views
4

У меня есть XML в следующем формате:Чтение из XML на основе нескольких атрибутов

<Accounts> 
    <Account ID="1" City="Bangalore" Amount="2827561.95" /> 
    <Account ID="225" City="New York" Amount="12312.00" /> 
    <Account ID="236" City="London" Amount="457656.00" /> 
    <Account ID="225" City="London" Amount="23462.40" /> 
    <Account ID="236" City="Bangalore" Amount="2345345.00" /> 
</Accounts> 

здесь, что делает счет уникальной является комбинация атрибутов ID и City.

Как я могу прочитать Amount уникально? Как узнать количество для комбинации атрибутов ID и City?

Например, мне необходимо получить Amount для счета с ID=225 и City=London. Если я использую такой код

Node.GetAttribute('ID')=225 

он всегда дает мне первый узел с ID = 225

Поблагодарив вас.

+1

Как вы используете 'Node.GetAttribute ('ID') = 225'? Вы используете его в цикле или ...? –

+0

Да .. Я использовал это внутри цикла. Что-то вроде ... Узел: = rootNode.ChildNodes.FindNode ('Учетные записи'); для i: = 0 to Node.ChildNodes.Count - 1 do begin childnode: = Node.ChildNodes [i]; если Node.HasAttribute ('ID'), то количество: = Node.GetAttribute ('ID'); ... .. – Pradeep

+0

Тогда вы могли бы просто добавить второе условие к вашему оператору if, которое сравнивает содержимое «Сити». –

ответ

12

Попробуйте использовать XPath, используя это предложение ./Accounts/Account[@ID="225"][@City="London"], чтобы найти узел.

Попробуйте этот образец

{$APPTYPE CONSOLE} 

uses 
    MSXML, 
    SysUtils, 
    ActiveX, 
    ComObj; 

Const 
XmlStr = 
' <Accounts>'+ 
' <Account ID ="1" City="Bangalore" Amount="2827561.95"/>'+ 
' <Account ID="225" City="New York" Amount="12312.00"/>'+ 
' <Account ID="236" City="London" Amount="457656.00"/>'+ 
' <Account ID="225" City="London" Amount="23462.40"/>'+ 
' <Account ID="236" City="Bangalore" Amount="2345345.00"/>'+ 
'</Accounts>'; 

procedure Test; 
Var 
    XMLDOMDocument : IXMLDOMDocument; 
    XMLDOMNode  : IXMLDOMNode; 
begin 
    XMLDOMDocument:=CoDOMDocument.Create; 
    XMLDOMDocument.loadXML(XmlStr); 
    XMLDOMNode := XMLDOMDocument.selectSingleNode(Format('./Accounts/Account[@ID="%s"][@City="%s"]', ['225', 'London'])); 
    if XMLDOMNode<>nil then 
    Writeln(Format('Amount %s',[String(XMLDOMNode.attributes.getNamedItem('Amount').Text)])); 
end; 

begin 
try 
    CoInitialize(nil); 
    try 
     Test; 
    finally 
     CoUninitialize; 
    end; 
except 
    on E:EOleException do 
     Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode])); 
    on E:Exception do 
     Writeln(E.Classname, ':', E.Message); 
end; 
Writeln('Press Enter to exit'); 
Readln; 
end. 
+3

+1. Вы также можете использовать XPath: '/ Accounts/Account [@ID ="% s "и @City ="% s "]' – kobik

0
function getAmount(Id, City: string): string; 
begin 
    Result := '' 
    aNode := xmldocument1.DocumentElement.ChildNodes['Accounts']; 
    for i := 0 to ChildNodes.Count do 
    with aNode.Nodes[i] do 
     if (Attributes['ID'] = Id) and (Attributes['City'] = City) then 
     begin 
     Result:= Attributes['Amount']; 
     Break; 
     end; 
    end; 
end; 
Смежные вопросы