Delphi-PRAXiS

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

matashen 13. Feb 2015 10:49

Attribute auslesen
 
Hallo zusammen,

nachdem ich jetzt schon einiges an Suchergebnissen durchgearbeitet habe aber auf keine Lösung gekommen bin die funktioniert hier mein Problem.

Ich möchte aus einer XML Datei bei folgendem Node die Attribute auslesen, im speziellem das Attribut Boardname.

Code:
?xml version="1.0" encoding="UTF-16"?>
<PCBData RecipeName="E1_Linie2\HM\HM Fest\HM Fest#1\HI_1384009-06" GenerateTraceData="True" TraceRequiresPCBBarcode="False" SiplaceProOID="28342960" BoardName="test\HI_1384009-06" SetupName="E1_Linie2\HM\HM Fest\HM Fest#1" LineName="E1_Linie2"
versucht hab ichs unter anderem mit folgendem Code, da bekomm ich aber nichtmal ein Node als gefunden zurück mynode bleibt also bei nil

Delphi-Quellcode:
           
              XMLdocument1.LoadFromFile(einstellungen.Pfad_Linecontrol);
              XMLdocument1.Active:=true;
              mynode:=XMLdocument1.ChildNodes.FindNode(Maschinen_Daten[ID].key);
              if mynode<>nil then begin;
                result:=vartostr(mynode.Attributes[Maschinen_Daten[ID].sektion]);
              end;
              XMLdocument1.Active:=false;
Bei den Maschinen Daten sind key und sektion noch so benannt weil früher ini-Strukturen gelesen wurden
Der Record wird an anderer Stelle gefüttert mit
key=PCBData
Sektion=BoardName


Was ich auch schon versucht habe aber ohne den Attribtu lesen zu können:
Delphi-Quellcode:
    if rootnode.ChildNodes[i].NodeName=suchnode then
                        if rootnode.ChildNodes[i].HasAttribute(suchattribut) then begin;
                          if rootnode.ChildNodes[i].attributes[suchattribut]<>NULL then
                            begin;
                              a:=vartostr(rootnode.ChildNodes[i].Attributes[suchattribut]);
                              break;
                            end;
                        end;
Hat jemand eine Lösung, evtl eine kleine Funktion wo mir hilft?

Gruß Matthias

Der schöne Günther 13. Feb 2015 11:03

AW: Attribute auslesen
 
Ich kann nicht verstehen, was dein genaues Problem ist. Den richtigen Knoten finden? Das Attribut im gefundenen Knoten auslesen?

Ich weiß nicht wie dein Dokument normal aussieht, aber hier mal als kleines Beispiel:

Delphi-Quellcode:
program Project22;

{$APPTYPE CONSOLE}

{$R *.res}

uses
   System.SysUtils,
   Xml.XmlIntf,
   Xml.XmlDoc,
   Winapi.ActiveX;

function determineBoardName(const ofNode: IXmlNode): String;
var
   pcbDataNode:   IXmlNode;
begin
   Result := EmptyStr;
   pcbDataNode := ofNode.ChildNodes.FindNode('PCBData');

   if Assigned(pcbDataNode) and pcbDataNode.HasAttribute('BoardName') then
      Result := pcbDataNode.Attributes['BoardName'];
end;


procedure justXmlThings();
const
   xmlContent: String =
      '<?xml version="1.0" encoding="UTF-16"?>' + sLineBreak +
      '<rootNode>' + sLineBreak +
      '   <PCBData ' + sLineBreak +
      '      RecipeName="E1_Linie2\HM\HM Fest\HM Fest#1\HI_1384009-06" ' + sLineBreak +
      '      GenerateTraceData="True" ' + sLineBreak +
      '      TraceRequiresPCBBarcode="False" ' + sLineBreak +
      '      SiplaceProOID="28342960" ' + sLineBreak +
      '      BoardName="test\HI_1384009-06" ' + sLineBreak +
      '      SetupName="E1_Linie2\HM\HM Fest\HM Fest#1" ' + sLineBreak +
      '      LineName="E1_Linie2" ' + sLineBreak +
      '   />' + sLineBreak +
      '</rootNode>';
var
   xmlDoc:      IXMLDocument;
   rootNode:   IXMLNode;
begin
   xmlDoc := LoadXMLData(xmlContent);
   rootNode := xmlDoc.DocumentElement;

   WriteLn( determineBoardName(rootNode) );
end;


begin
  try
   CoInitializeEx(nil, COINIT_SPEED_OVER_MEMORY);
   try
      justXmlThings();
   finally
      CoUninitialize();
    end;
  except
    on E: Exception do
     Writeln(E.ClassName, ': ', E.Message);
  end;
  readln;
end.

matashen 13. Feb 2015 11:14

AW: Attribute auslesen
 
Hi Günther,

das ist nicht anders als meins.

Mir ist jetzt im Vergleich zu deinem String mit XML Daten aufgefallen das das erzeugte XML das ich auswerten will keinen rootnode hat.

Kann evtl deswegen das XML nicht richtig gelesen werden?
Und wie komm ich dann an die Informationen ran?

Gruß Matthias

Der schöne Günther 13. Feb 2015 11:22

AW: Attribute auslesen
 
Den Knoten "root" habe ich nur Drumherum gemacht weil ich gedacht habe dass der Knoten "PCBData" einer von vielen ist und noch mehr auf derselben Hierarchie-Ebene sind.

Ein XML-Dokument braucht einen einzigen Root-Knoten, das geht gar nicht anders. Aber damit erzähle ich dir wohl nichts neues ;-)

Was ist denn "nicht richtig gelesen"? Findest du den "PCBData"-Knoten nicht? Oder hast du ihn und es kommt raus er habe kein Attribut "BoardName"? Hast du ein Schema oder DTD zur XML-Struktur?

matashen 16. Feb 2015 09:19

AW: Attribute auslesen
 
Hallo Günther,

Danke für deine Hilfe,

den Fehler hab ich gefunden. Einmal drüber schlafen und einen flüchtigkeitsfehler in einem anderen Codeteil entdeckt.

Ich sollte öfters mal drüber oder wenigstens Schlafen.


Gruß Matthias

himitsu 16. Feb 2015 09:35

AW: Attribute auslesen
 
Nur noch etwas bezüglich dem
Delphi-Quellcode:
<>NULL
.

NULL <> nil

Und wenn ein Element (Node oder Attribute) nicht gefunden wird, dann ergibt das nil.

Der schöne Günther 16. Feb 2015 09:50

AW: Attribute auslesen
 
Ich glaube das war schon so gewollt:
Delphi-Quellcode:
IXMLNode::Attributes['someName']
liefert einen
Delphi-Quellcode:
OleVariant
und sein
Delphi-Quellcode:
NULL
(
Delphi-Quellcode:
System.Variants.Null()
) vergleicht damit.

Wäre mir aber auch zu abenteuerlich, ich hätte mit
Delphi-Quellcode:
myXmlNode.HasAttribute('someName')
geprüft und mir sonst keine weiteren Gedanken gemacht...

himitsu 16. Feb 2015 10:02

AW: Attribute auslesen
 
Ups, mir war so, daß wenn das erstmal einen Interface liefert und dann .Text, .Value oder so auf den Inhalt zugegriffen wird.
OK, wenn Variant, dann könnte NULL doch stimmen, aber dennoch wäre dann Delphi-Referenz durchsuchenIsNull wohl die bessere Lösung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:03 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