2012-05-03 2 views
2

Я новичок в использовании XML в Delphi и использовал уже опубликованные вопросы, чтобы узнать, что мне нужно знать (спасибо!). Однако ... Я изо всех сил пытаюсь получить значение данных из верхней части файла XML, выпущенного одним из наших поставщиков.Delphi XML - получение значения из родительского узла

В верхней части файла XML показан ниже:

<?xml version="1.0" encoding="utf-8"?> 
<form billId="1004" penId="ABCDE" appName="Report Sheet" penSerialNo="AJX-AAT-AGK-B4" > 
<question id="1" reference="site_name" value="Acme Inc" /></question> 
<question id="2" reference="site_address" value="London" /></question> 
<question id="3" reference="TQM_job_no" value="AB1234567" /></question> 
<question id="4" reference="TQM_site_no" value="XX999" /></question> 

Как я могу получить penId и penSerialNo значения?

Для справки, я использую ниже код, полученный из другого поста на сайте, чтобы пройти через XML и получить значения из вопроса узлов:

for i:= 0 to XMLDocument1.DocumentElement.ChildNodes.Count - 1 do 
    begin 
     Node:= XMLDocument1.DocumentElement.ChildNodes[I]; 
if Node.NodeName = 'question' then 
    begin 
    if Node.HasAttribute('value') then 
    VALUEvar:= Node.Attributes[value']; 
    // do something with VALUEvar which is a string 
     end; 
end; 
end; 

Я был бы очень признателен за любую помощь что может быть предоставлено ... спасибо заранее!

+1

Просто изменить ' 'question'' в'' form'' и ' 'value'' на «penId». Вы пробовали это? Не самое оптимальное решение, но мне интересно, пытались ли вы это сделать. – Pateman

+0

Привет, да, я пробовал это, без успеха. Я добавил строку кода: если Node.NodeName = 'form', то showmessage ('Hello World'); , но это сообщение никогда не отображается, поэтому я не понимаю, как я могу получить значения атрибутов, которые мне нужны >> – Gary

+2

Является ли допустимым использование ''? – TLama

ответ

3

Поскольку form ваш корневой узел, вы можете использовать что-то вроде этого:

uses 
    XMLDoc, XMLIntf; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    XMLDocument: IXMLDocument; 
begin 
    XMLDocument := LoadXMLDocument('c:\YourFile.xml'); 
    if XMLDocument.DocumentElement.HasAttribute('penId') then 
    ShowMessage(VarToStr(XMLDocument.DocumentElement.Attributes['penId'])); 
    if XMLDocument.DocumentElement.HasAttribute('penSerialNo') then 
    ShowMessage(VarToStr(XMLDocument.DocumentElement.Attributes['penSerialNo'])); 
end; 

Во всяком случае, ваш документ является недействительным. Вы не можете использовать теги, заключенные, как:

<tag attr="value"/></tag> 

Либо использовать:

<tag attr="value"/> 

или

<tag attr="value"></tag> 
+3

Спасибо за ответ re root node, это очень ценно, и это работает точно так, как требуется. Я не создаю XML, поэтому я вернулся к поставщику о тегах. – Gary

+3

Поставщики продуктов, которые производят Malformed XML, я бы хотел, чтобы это было редко, но это не так. –

+2

Я видел ужасы приложений, производящих XML с помощью ванильных строк. Да, его там. Думаю, этот образец XML имеет некоторые проблемы. – Runner

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