Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pretraga XML noda koji nedostaje

[es] :: Pascal / Delphi / Kylix :: Pretraga XML noda koji nedostaje

[ Pregleda: 2071 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

mica99
Srbija

Član broj: 243749
Poruke: 90
*.dynamic.isp.telekom.rs.



+1 Profil

icon Pretraga XML noda koji nedostaje06.02.2014. u 18:15 - pre 123 meseci
Pozdrav,
Kako je moguce da se pronalazi odredjeni nod u jednom child nodu koji nedostaje i da se automatski upisuje.

Primer:

<Main>Neki text>
<A>Neki text</>
<B>Neki text</>
</Main>
.
.
<Main>Neki text>
<A>Neki text</>
<B>Neki text</>
</Main>
.
.
<Main>Neki text>
<A>Neki text</>
<B>Neki text</>
</Main>
.
.
.
Pitanje je kako da pronalazim ako u nekom child nodu fali node B i ako fali da ga automatski upisuje naravno bez ikakvog texta.
Da napomenem jer node B nije uvek drugi po redu

Hvala




 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
..ppoe.dyn.broadband.blic.net.



+62 Profil

icon Re: Pretraga XML noda koji nedostaje07.02.2014. u 21:42 - pre 123 meseci
Da li namerno ili slucajno ovo pitas na Delphi forumu?

Ako namerno, pa postoje klase za rad sa xml-om. Otprilike bi trebalo da pozivom neke metode parent node-a trazis subnode B; ukoliko ga nema, metoda vraca nil. Ako vrati nil, ti onda kreiras i upisujes (opet metodom parent node-a) novi subnode B. Tako nekako bi trebalo da radi... ;)

Pozz
 
Odgovor na temu

((BugA))
Igor Djordjevic
Bor, Srbija

Član broj: 29241
Poruke: 196
*.dynamic.sbb.rs.

ICQ: 66516695
Sajt: www.MalamutKlub.com


+17 Profil

icon Re: Pretraga XML noda koji nedostaje07.02.2014. u 22:07 - pre 123 meseci
Evo nesto za pocetak, pa se ti igraj dalje :)

Code:
uses
  ComObj,
  MSXML;

procedure InsertMissingChildNode(
  AParentNode: IXMLDOMNode;
  AChildName : string;
  AChildValue: string;
  AChildLevel: integer = 1);
var
  i: integer;
  bFound: Boolean;
  xmlNode: IXMLDOMNode;
begin
  bFound := False;
  Dec(AChildLevel);
  //
  for i := 0 to AParentNode.childNodes.length-1 do
  begin
    if (AChildLevel > 0) then
      InsertMissingChildNode(
        AParentNode.childNodes[i],
        AChildName,
        AChildValue,
        AChildLevel
      );
    //
    bFound := (bFound OR (AParentNode.childNodes[i].nodeName = AChildName));
  end;
  //
  if ((not bFound)
    and (AParentNode.nodeType = NODE_ELEMENT)
    and (AChildLevel = 0)) then
  begin
    xmlNode := AParentNode.ownerDocument.createElement(AChildName);
    if (AChildValue <> '') then
      xmlNode.text := AChildValue;
    //
    AParentNode.appendChild(xmlNode);
  end;
end;

Upotreba:
Code:
var
  xmlDoc: IXMLDOMDocument;
  xmlText: string;
begin
  xmlText := '<root>'
    + '  <Main>Neki text'
    + '    <A>Neki text</A>'
    + '    <B>Neki text</B>'
    + '  </Main>'
    + '  <Main>Neki text'
    + '    <A>Neki text</A>'
    //     ovde nedostaje <B/>
    + '  </Main>'
    + '</root>';
  //
  xmlDoc := CreateOleObject('Microsoft.XMLDOM') as IXMLDOMDocument;
  xmlDoc.preserveWhiteSpace := True;
  xmlDoc.loadXML(xmlText);
  //
  InsertMissingChildNode(xmlDoc.firstChild, 'B', '', 2);
  ShowMessage(xmlDoc.xml);
end;

Evo i rezultata u zavisnosti od parametra "AChildLevel":
Code:
Pocetni XML:
<root>
  <Main>Neki text
    <A>Neki text</A>
    <B>Neki text</B>
  </Main>
  <Main>Neki text
    <A>Neki text</A>
  </Main>
</root>

Poziv: InsertMissingChildNode(xmlDoc.firstChild, 'B', '', 2);
Rezultat:
<root>
  <Main>Neki text    
    <A>Neki text</A>
    <B>Neki text</B>
  </Main>
  <Main>Neki text    
    <A>Neki text</A>
    <B/> <-- dodati element (child level 2 u odnosu na root)
  </Main>
</root>

Poziv: InsertMissingChildNode(xmlDoc.firstChild, 'B', '');
Rezultat:
<root>
  <Main>Neki text    
    <A>Neki text</A>    
    <B>Neki text</B>  
  </Main>
  <Main>Neki text    
    <A>Neki text</A>  
  </Main>
  <B/> <-- dodati element (child level 1 u odnosu na root)
</root>

Poziv: InsertMissingChildNode(xmlDoc.firstChild, 'B', '', 3);
Rezultat:
<root>
  <Main>Neki text    
    <A>Neki text
      <B/> <-- dodati element (child level 3 u odnosu na root)
    </A>
    <B>Neki text
      <B/> <-- dodati element (child level 3 u odnosu na root)
    </B>
  </Main>
  <Main>Neki text    
    <A>Neki text
      <B/> <-- dodati element (child level 3 u odnosu na root)
    </A>
  </Main>
</root>

Pozdrav, BugA
 
Odgovor na temu

mica99
Srbija

Član broj: 243749
Poruke: 90
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Pretraga XML noda koji nedostaje08.02.2014. u 18:59 - pre 123 meseci
Hvala puno za pomoc
 
Odgovor na temu

mica99
Srbija

Član broj: 243749
Poruke: 90
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Pretraga XML noda koji nedostaje12.02.2014. u 13:23 - pre 123 meseci
Izvini sto te opet pitam ali kako da te promene uradim u nekom externom xml fajlu.
Zaci da ucita fajl, uradi promene i da ga sacuva

Hvala ti jos jednom
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Pretraga XML noda koji nedostaje12.02.2014. u 14:34 - pre 123 meseci
Code (delphi):
xmlDoc.loadXML(xmlText);


Varijable xmlText je putanja do .xml fajle (ako sam dobro shvatio kod od Bug-a). Najbolje ti je da staviš npr OpenDialog na formu i onda ovako nekako:

Code (delphi):
if OpenDialog1.Execute then
xmlText:= OpenDialog1.FileName;

F
 
Odgovor na temu

mica99
Srbija

Član broj: 243749
Poruke: 90
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Pretraga XML noda koji nedostaje12.02.2014. u 14:49 - pre 123 meseci
Ne moze jer xmlText je string a mislim da se treba napraviti string list
 
Odgovor na temu

((BugA))
Igor Djordjevic
Bor, Srbija

Član broj: 29241
Poruke: 196
*.dynamic.sbb.rs.

ICQ: 66516695
Sajt: www.MalamutKlub.com


+17 Profil

icon Re: Pretraga XML noda koji nedostaje12.02.2014. u 22:53 - pre 123 meseci
Uz ono sto smo ti captPicard i ja vec napisali, to bi moglo da izgleda na primer ovako, upotreba:

Code:
var
  xmlDoc: IXMLDOMDocument;
  openDialog: TOpenDialog;
  sFile: string;
begin
  openDialog := TOpenDialog.Create(nil);
  try
    if (openDialog.Execute) then
    begin
      sFile := openDialog.FileName;
      //
      xmlDoc := CreateOleObject('Microsoft.XMLDOM') as IXMLDOMDocument;
      xmlDoc.preserveWhiteSpace := True;
      xmlDoc.load(sFile);
      //
      InsertMissingChildNode(xmlDoc.firstChild, 'B', '', 2);
      xmlDoc.save(sFile);
    end;
  finally
    openDialog.Free();
  end;
end;

Pozdrav, BugA
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
..ppoe.dyn.broadband.blic.net.



+62 Profil

icon Re: Pretraga XML noda koji nedostaje13.02.2014. u 10:43 - pre 123 meseci
Citat:
mica99:
Ne moze jer xmlText je string a mislim da se treba napraviti string list


Malo (samo)inventivnosti ne bi bilo na odmet...

Pozz
 
Odgovor na temu

mica99
Srbija

Član broj: 243749
Poruke: 90
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Pretraga XML noda koji nedostaje13.02.2014. u 20:10 - pre 123 meseci
Hvala vam puno za pomoc.
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Pretraga XML noda koji nedostaje

[ Pregleda: 2071 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.