Lazarus 3.0 (2023.12.21.)
Letöltés

  • Oldal:
  • 1

TÉMA:

Válasz: XML 2013 szept. 25 16:31 #1285

  • ggallo
  • ggallo profilkép
  • Új tag
  • Új tag
  • Hozzászólások: 1
  • Köszönetek: 0
Hali!

Talán tudok segíteni, épp egy XML-lel kommunikáló programon dologzok.
Viszont nem világos a kérdésed: az mit takar, hogy az <invoice></invoice> eltávolítása után jó? Az a root node, miért kell eltávolítani? Azért, mert csak a <invoiceitems> "látszik" onnan, azon belül nem? Az nem baj, a root alatt az a szint van, tovább kell menned a struktárán.

Annyit kell csinálnod, hogy bejárod a teljes struktúrát, és úgy keresed meg amit szeretnél. Ez a legegyszerűbben egy rekurzív függvénnyel oldható meg. Az általad említett oldalon a "Fastruktúra feltöltése XML-lel" találsz ilyen példát, benne a szükséges rekurzív függvénnyel. Azzal meg tudsz keresni konkrét node-ot (akár egy ág legvégén is).

De így is csinálhatod, ha egy egyszerű indulás kell:
var
  Node: TDOMNode = nil;
  Child: TDOMNode = nil;
  Item: TDOMNode = nil;
begin
  Node := XMLDocument.DocumentElement.FindNode('invoiceitems');
  for Child in Node do
    for Item in Child do
      writeln(Item.NodeName + ': ' + Item.TextContent);
end;

Így a Node az "invoiceitems" struktúrára mutat (lehet a root alatt más node is, azt is megkeresheted így). Fontos, hogy a FindNode csak az adott node gyerekei között keres azokon belül nem.

Utána a Child az "invoiceitem" lesz, sorra az összes (for..in..do).
Ezen belül az Item az "item1", "item2", stb. lesz, amennyi van.
Így csak a létezőket járod végig, ezen a konkrét struktúrán.
Ezt már át tudod alakítani másmilyenre, vagy legalább ötletet ad az induláshoz.

Ha jól tévedek, akkor a ReadXMLFile (ha azzal olvasod be az XML-t) kihagyja az üres node-okat, így az "item2" elmarad már beolvasás közben.

XML 2013 szept. 20 04:55 #1284

  • SziZo
  • SziZo profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 12
  • Köszönetek: 0
Kedves Mindenki

Az XML kezeléssel akadtam el.
A feldolgozandó XML:
<?xml version="1.0" encoding="utf-8"?>
<invoice>
<invoiceitems>
<invoiceitem>
<item1>61s677</item1>
<item2></item2>
</invoiceitem>
<invoiceitem>
<item1>61ss2677</item1>
<item2></item2>
</invoiceitem>
</invoiceitems>
</invoice>

A mintaprogramokat innen vettem:

wiki.freepascal.org/XML_Tutorial/hu

Problémáim:

Ha az <invoice></invoice> eltávolítása után nagyjából megy. Nem triviális, hogyan kell a progit átalakítani, hogy tetszőleges mélységet bejárjon.

Az üres elemek hibaüzenetet adnak.

Köszönettel:

SziZo

  • Oldal:
  • 1