AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Attribute auslesen

Ein Thema von matashen · begonnen am 13. Feb 2015 · letzter Beitrag vom 16. Feb 2015
Antwort Antwort
matashen

Registriert seit: 29. Jan 2007
Ort: daheim
460 Beiträge
 
Delphi XE2 Enterprise
 
#1

Attribute auslesen

  Alt 13. Feb 2015, 10:49
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
Matthias
Das Leben ist eines der härtesten.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Attribute auslesen

  Alt 13. Feb 2015, 11:03
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.
  Mit Zitat antworten Zitat
matashen

Registriert seit: 29. Jan 2007
Ort: daheim
460 Beiträge
 
Delphi XE2 Enterprise
 
#3

AW: Attribute auslesen

  Alt 13. Feb 2015, 11:14
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
Matthias
Das Leben ist eines der härtesten.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Attribute auslesen

  Alt 13. Feb 2015, 11:22
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?
  Mit Zitat antworten Zitat
matashen

Registriert seit: 29. Jan 2007
Ort: daheim
460 Beiträge
 
Delphi XE2 Enterprise
 
#5

AW: Attribute auslesen

  Alt 16. Feb 2015, 09:19
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
Matthias
Das Leben ist eines der härtesten.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#6

AW: Attribute auslesen

  Alt 16. Feb 2015, 09:35
Nur noch etwas bezüglich dem <>NULL .

NULL <> nil

Und wenn ein Element (Node oder Attribute) nicht gefunden wird, dann ergibt das nil.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Attribute auslesen

  Alt 16. Feb 2015, 09:50
Ich glaube das war schon so gewollt: IXMLNode::Attributes['someName'] liefert einen OleVariant und sein NULL (System.Variants.Null() ) vergleicht damit.

Wäre mir aber auch zu abenteuerlich, ich hätte mit myXmlNode.HasAttribute('someName') geprüft und mir sonst keine weiteren Gedanken gemacht...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#8

AW: Attribute auslesen

  Alt 16. Feb 2015, 10:02
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:09 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