Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 парсинг xml - value  [new]
VladimirVVP
Member

Откуда:
Сообщений: 48
Увожаемые знатоки, помогите мне получить из этой части XML документа значение VALUE..

<Address>
	<adrs:OKATO>40279562000</adrs:OKATO>
	<adrs:KLADR>78000000000078500</adrs:KLADR>
	<adrs:Region>78</adrs:Region>
	<adrs:Street Name="Маршала Захарова" Type="ул" />
	<adrs:Level1 Type="д" Value="12" />
	<adrs:Level2 Type="корп" Value="1" />
	<adrs:Level3 Type="литера" Value="А" />
	<adrs:Apartment Type="кв" Value="144" />
</Address>



привиденная ниже процедура рабочая, но я не могу понять как мне получить эти значения, сразу сделаю замечание, что значение Type может меняться..


procedure Form1_Button1_OnClick (Sender: TObject; var Cancel: boolean);
var
    sl:TStringList;
    s, sRow, sReestrExtract,sAdres: string;
    iPos1, iPos2, iOffset: integer;
begin
     sl:= TStringList.Create;
     sl.LoadFromFile('kv_0aa24c23-6862-49d3-a228-5d207b59f333(1).xml');
     iOffset := 1;
     iPos1 := 1;
while true do
     begin

         iPos1 := PosEx('<Right>', sl.Text, iOffset);
         if iPos1=0 then break;

         iPos2 := PosEx('</Right>', sl.Text, iOffset);
         iOffset := iPos2+1;

         sRow := Copy(sl.Text, iPos1, iPos2-iPos1);

         sAdres := Copy(sl.Text,  Pos('<Address>', sl.Text),  Pos('</Address>', sl.Text)-Pos('<Address>', sl.Text) );

         s :=Copy(sRow, Pos('<FamilyName>', sRow)+Length('<FamilyName>') , Pos('</FamilyName>', sRow)-Pos('<FamilyName>', sRow)-Length('<FamilyName>'));
         s := s+' '+ Copy(sRow, Pos('<FirstName>', sRow)+Length('<FirstName>') , Pos('</FirstName>', sRow)-Pos('<FirstName>', sRow)-Length('<FirstName>'));
         s := s+' '+ Copy(sRow, Pos('<Patronymic>', sRow)+Length('<Patronymic>') , Pos('</Patronymic>', sRow)-Pos('<Patronymic>', sRow)-Length('<Patronymic>'));

         showmessage(s);

   end;

end;
17 сен 19, 18:31    [21972811]     Ответить | Цитировать Сообщить модератору
 Re: парсинг xml - value  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1579
uses
  Xml.XmlIntf, Xml.XmlDoc;
...
var XmlDoc := LoadXMLDocument('kv_0aa24c23-6862-49d3-a228-5d207b59f333(1).xml');
var AddressNode := XmlDoc.DocumentElement;
var Element := AddressNode.ChildNodes.First();
while Assigned(Element) do
begin
  var AttrValue := Element.AttributeNodes.FindNode('Value');
  if Assigned(AttrValue) then
    ShowMessage(AttrValue.NodeValue);
  Element := Element.NextSibling();
end;
17 сен 19, 19:19    [21972829]     Ответить | Цитировать Сообщить модератору
 Re: парсинг xml - value  [new]
VladimirVVP
Member

Откуда:
Сообщений: 48
X-Cite, Спасибо, но не то

мне нужна (явная выборка) надеюсь я правельно сказал, то есть взять значение Value из adrs:Level1 и ТД

С начало я получаю ФИО - это сделано, работает

далее мне нужно получить Value

Дом Кв .. и ТП
...

потом это все я записываю в БД и вывовожу в гриде...
17 сен 19, 19:51    [21972844]     Ответить | Цитировать Сообщить модератору
 Re: парсинг xml - value  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1579
Обычно структура xml строго типизирована, ессно если у вас есть xsd схема для нее.
Если все ваши элементы обязательные, то через Element.nextSibling(); можно их перебрать зная порядок (гарантируется схемой)

var AddressNode := XmlDoc.DocumentElement;
var Temp := AddressNode.ChildNodes.First();
Temp := Temp.nextSibling();
Temp := Temp.nextSibling();
Temp := Temp.nextSibling();
var Level1 := Temp.nextSibling();
var Level2 := Level1.nextSibling();
var Level3 := Level2.nextSibling();


ну или так:

var AddressNode := XmlDoc.DocumentElement;
var Level1 := AddressNode.ChildNodes.FindNode('Level1', 'adrs');
if Assigned(Level1)
begin
  var AttrValue := Level1.AttributeNodes.FindNode('Value');
  if Assigned(AttrValue) then
    ShowMessage(AttrValue.NodeValue);
end;
var Level2 := AddressNode.ChildNodes.FindNode('Level2', 'adrs');
if Assigned(Level2)
begin
  var AttrValue := Level2.AttributeNodes.FindNode('Value');
  if Assigned(AttrValue) then
    ShowMessage(AttrValue.NodeValue);
end;


И вообще, если у вас структура xml постоянная, то воспользуйтесь мастером XML Data Binding
Он вам нарисует объектную модель под ваш xml и вы через свойства будете обращаться к значениям
Что-то типа такого:
var Addr := LoadXml(...).Address;
ShowMessage(Addr.Level1.Value);
ShowMessage(Addr.Level2.Value);
ShowMessage(Addr.Level3.Value);
17 сен 19, 20:07    [21972850]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить