Всех приветствую. Нужен парсер для XML файла, маюсь уже не первый день. Нормальной документации по TXMLDocument и IXMLNode нету. Приходится выкручиваться, что-то прочитал на форумах, что-то понял методом тыка... Вообщем есть XML файл :
Код:
<ltm version="1.0" type="settings" >
<progname>LTM</progname>
<templateFiles>
<assets>fon.png</assets>
<assets>fon_map.png</assets>
<assets>start.js</assets>
<assets>up.jpg</assets>
<images>
<pano>
<tiles>pano_u.jpg</tiles>
<tiles>pano_d.jpg</tiles>
<tiles>pano_f.jpg</tiles>
</pano>
<tour>
<tourimages>start.jpg</tourimages>
<tourimages>tmb.jpg</tourimages>
</tour>
</images>
</templateFiles>
<dimensions>
<tiles type="pc">1910</tiles>
<tiles type="ipad">768</tiles>
<tiles side="iphone">512</tiles>
<tourimages name="start.jpg" edge="long">1024</tourimages>
<tourimages name="start.jpg" edge="short">768</tourimages>
</dimensions>
<hotspot name="hs015_2" style="mappoint" scena="scene017" ath="68.17644363437007" />
<hotspot name="hs015_1" style="mappoint" scena="scene014" rz="4436007"/>
<data name="onstart" mode="noVoice">Some text</data>
<data name="onerror" mode="noVoice">Some errortext</data>
<data name="onerror" mode="alarm">Other errortext</data>
</ltm>
И собственно сама программа :
Код:
program XMLParser;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
Xml.XMLDoc, XMLIntf, ActiveX;
var XMLDocument1 : TXMLDocument;
Node1 : IXMLNode;
I : Integer;
begin
CoInitialize(nil);
XMLDocument1:=TXMLDocument.Create(nil);
XMLDocument1.LoadFromFile(FileName);
XMLDocument1.Active := true;
Node1:= XMLDocument1.DocumentElement;
for i := 0 to Node1.ChildNodes.Count - 1 do
begin
WriteLn(Node1.ChildNodes[i].NodeName); //Прочитать и вывести все элементы принадлежащие Lmt
end;
for i := 0 to Node1.AttributeNodes.Count - 1 do
begin
WriteLn(Node1.AttributeNodes[i].NodeName
+ '="' + Node1.AttributeNodes[i].NodeValue + '"');//Выводит артибуты элемента, но почему то только Lmt.
end;
XMLDocument1.Active := false;
ReadLn;
end.
Что я хочу:
- Прочитать скажем вот этот элемент "<data name="onerror" mode="noVoice">Some errortext</data>"
- Если (name="123") тогда скопировать из элемента <tourimages name="start.jpg" edge="long">1024</tourimages> значение атрибута edge="long" в файл
- Иначе продолжить листать файл дальше(тегов очень много, просто они повторяются)
Запись в файл думаю организую сам, с этим проблем не будет. Есть идея запустить перебор и в процессе него организовать все эти действия, только как? И почему
Код:
for i := 0 to Node1.AttributeNodes.Count - 1 do
begin
WriteLn(Node1.AttributeNodes[i].NodeName
+ '="' + Node1.AttributeNodes[i].NodeValue + '"')
выводит артибуты только Lmt. Пробовал вставлял его в циклы, все равно. Нужна ваша помощь, очень не хватает знаний по этой теме. Прежде всего нужен опыт, ну а потом уже работающая программа. Графический интерфейс не предлагать! Надеюсь все правильно описал. Сильно не пинайте, только учусь.