Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Attribute auslesen (https://www.delphipraxis.net/111398-attribute-auslesen.html)

krys2000 2. Apr 2008 20:46


Attribute auslesen
 
Hi Leute!

Ich möchte von dieser Datei id-prod und beschr auslesen.
Ich habe nur wenig Erfahrung mit Xml deshalb Bitte ich um ein Tip was mache ich hier falsch?.

Delphi-Quellcode:
<?xml version="1.0" encoding="UTF-8" ?>

<komunikat xmlns="www.bla.gov.pl/xml/zaehler/1" xmlns:kpz="www.bla.gov.pl/xml/zaehler/1"

wersja="2" nr-gen="1002" >

  <klient id="222222" />

 <abc:raport-weryf-ware id-klient="101149" vertrag="123456678654" jahr="2008" monat="02">

 <abc:raport-weryf id-prod="11794" wers="1" >
  <problem kat="B" kod="43" beschr="Fehler Beschreibeung_1" />
  </abc:raport-weryf>

 <abc:raport-weryf id-prod="11795" wers="1" >
  <problem kat="B" kod="44" beschr="Fehler Beschreibeung_2" />
  </abc:raport-weryf>

  <abc:raport-weryf id-prod="11796" wers="1" >
  <problem kat="B" kod="43" beschr="Fehler Beschreibeung_3" />
  </abc:raport-weryf>

 </abc:raport-weryf-ware>
  </komunikat>
Hier ist kein Problem

Delphi-Quellcode:
xmlDoc:=CoDOMDocument40.Create;
 xmlDoc.setProperty('NewParser', True);
 xmlDoc.setProperty('SelectionLanguage', 'XPath');
 xmlDoc.setProperty('SelectionNamespaces', 'xmlns:kpz="www.bla.gov.pl/xml/zaehler/1"');

 xmlDoc.load(Path + DATABASE_FNAME+'.xml');

   FeldName:='';
   FeldName:='abc:raport-weryf';
   nl := xmlDoc.documentElement.selectNodes('//'+FeldName);
   for i := 0 to Pred(nl.length) do
   begin
   
    FeldName:='';
    e := nl.item[i] as IXMLDOMElement;

       FeldName:='id-prod';
       FeldValue:=e.getAttribute(FeldName);
       if (not VarIsNull(FeldValue)) then
       Id_prod := FeldValue;

        FeldName:='wers';
       FeldValue:=e.getAttribute(FeldName);
       if (not VarIsNull(FeldValue)) then
       Version := FeldValue;
    end;
Aber hier zeigt mir jedes mal nl.length=0!

Delphi-Quellcode:
FeldName:='';
   FeldName:='problem';
   nl := xmlDoc.documentElement.selectNodes('//'+FeldName);
   for i := 0 to Pred(nl.length) do
   begin
   
    FeldName:='';
    e := nl.item[i] as IXMLDOMElement;

       FeldName:='kat';
       FeldValue:=e.getAttribute(FeldName);
       if (not VarIsNull(FeldValue)) then
       Kategorie := FeldValue;

        FeldName:='beschr';
       FeldValue:=e.getAttribute(FeldName);
       if (not VarIsNull(FeldValue)) then
       Beschreibung:= FeldValue;
    end;
Ich Bitte Euch hilft mir ich weiss nicht was ich mache soll!
Grüße
Krys

marabu 2. Apr 2008 21:16

Re: Attribute auslesen
 
Hallo Krys,

du kannst alles in einem erledigen:

Delphi-Quellcode:
const
  ELEM_RAPORT_WERYF = 'abc:raport-weryf';
  ELEM_PROBLEM = 'problem';
  ATTR_ID_PROD = 'id-prod';
  ATTR_WERS = 'wers';
  ATTR_KAT = 'kat';
  ATTR_BESCHR = 'beschr';

procedure ShowParseError(xd: IXMLDOMDocument2);
begin
  ShowMessage(xd.parseError.reason);
end;

procedure TDemoForm.ButtonClick(Sender: TObject);
var
  xmlDoc: IXMLDOMDocument2;
  nl: IXMLDOMNodeList;
  e: IXMLDOMElement;
  id_prod, version, kat, beschr, path: string;
  i: Integer;
begin
  xmlDoc := CoDOMDocument40.Create;
  xmlDoc.setProperty('NewParser', True);
  xmlDoc.setProperty('SelectionLanguage', 'XPath');
  xmlDoc.setProperty('SelectionNamespaces', 'xmlns:kpz="www.bla.gov.pl/xml/zaehler/1"');

  if xmlDoc.load(Path + DATABASE_FNAME+'.xml') then
  begin
    nl := xmlDoc.documentElement.selectNodes('//' + ELEM_RAPORT_WERYF);
    for i := 0 to Pred(nl.length) do
    begin
      e := nl.item[i] as IXMLDOMElement;
      id_prod := VarToStr(e.getAttribute(ATTR_ID_PROD));
      version := VarToStr(e.getAttribute(ATTR_WERS));
      with e.selectSingleNode({'//' +} ELEM_PROBLEM) as IXMLDOMElement do // EDIT
      begin
        kat := VarToStr(e.getAttribute(ATTR_KAT));
        beschr := VarToStr(e.getAttribute(ATTR_BESCHR));
      end;
    end;
  end else ShowParseError(xmlDoc);
end;
Freundliche Grüße

krys2000 3. Apr 2008 17:46

Re: Attribute auslesen
 
Danke marabu,

leider hat sich nichts verändert.

An dieser Stelle wird kat und beschr immer noch als '' angezeigt als ob ELEM_PROBLEM nicht vorhanden wäre.


Delphi-Quellcode:
with e.selectSingleNode('//' + ELEM_PROBLEM) as IXMLDOMElement do
      begin
        kat := VarToStr(e.getAttribute(ATTR_KAT));
        beschr := VarToStr(e.getAttribute(ATTR_BESCHR));
      end;
Grüsse
krys2000

marabu 3. Apr 2008 21:17

Re: Attribute auslesen
 
Hallo,

ein Copy & Paste Fehler von mir - schau dir bitte nochmal den korrigierten Beispiel-Code an.

Gute Nacht

krys2000 3. Apr 2008 22:59

Re: Attribute auslesen
 
Danke marabu,

für Deine Hilfsbereitschaft, aber es ist beim Altem geblieben.
kat und beschr werden jedes mal als '' ausgelesen.

Delphi-Quellcode:
with e.selectSingleNode({'//' +} ELEM_PROBLEM) as IXMLDOMElement do // EDIT

      begin
        kat := VarToStr(e.getAttribute(ATTR_KAT));
        beschr := VarToStr(e.getAttribute(ATTR_BESCHR));
      end;
Grüsse
Krys2000

krys2000 8. Apr 2008 10:05

Re: Attribute auslesen
 
Hi Leute,
gibt wirklich keine Möglichkeit die Attribute auszulesen?

Grüsse
krys

marabu 8. Apr 2008 18:17

Re: Attribute auslesen
 
Hallo Krys,

es gibt eine Möglichkeit.

Hast du nicht bemerkt, dass ich die Attribute von e auslese? Dort gibt es sie aber nicht:

Delphi-Quellcode:
const
  ELEM_RAPORT_WERYF = 'abc:raport-weryf';
  ELEM_PROBLEM = 'abc:problem';
  ATTR_ID_PROD = 'id-prod';
  ATTR_WERS = 'wers';
  ATTR_KAT = 'kat';
  ATTR_BESCHR = 'beschr';

procedure ShowParseError(xd: IXMLDOMDocument2);
begin
  ShowMessage(xd.parseError.reason);
end;

procedure TDemoForm.ButtonClick(Sender: TObject);
var
  xmlDoc: IXMLDOMDocument2;
  nl: IXMLDOMNodeList;
  e, eProblem: IXMLDOMElement;
  id_prod, version, kat, beschr, path: string;
  i: Integer;
begin
  xmlDoc := CoDOMDocument40.Create;
  xmlDoc.setProperty('NewParser', True);
  xmlDoc.setProperty('SelectionLanguage', 'XPath');
  xmlDoc.setProperty('SelectionNamespaces', 'xmlns:abc="www.bla.gov.pl/xml/zaehler/1"');

  if xmlDoc.load(Path + DATABASE_FNAME + '.xml') then
  begin
    nl := xmlDoc.documentElement.selectNodes('//' + ELEM_RAPORT_WERYF);
    for i := 0 to Pred(nl.length) do
    begin
      e := nl.item[i] as IXMLDOMElement;
      id_prod := VarToStr(e.getAttribute(ATTR_ID_PROD));
      version := VarToStr(e.getAttribute(ATTR_WERS));
      eProblem := e.selectSingleNode(ELEM_PROBLEM) as IXMLDOMElement;
      if Assigned(eProblem) then
      begin
        kat := VarToStr(eProblem.getAttribute(ATTR_KAT));
        beschr := VarToStr(eProblem.getAttribute(ATTR_BESCHR));
        ShowMessage(kat + sLineBreak + beschr);
      end;
    end;
  end else ShowParseError(xmlDoc);
end;
Freundliche Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz