![]() |
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:
versucht hab ichs unter anderem mit folgendem Code, da bekomm ich aber nichtmal ein Node als gefunden zurück mynode bleibt also bei nil
?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"
Delphi-Quellcode:
Bei den Maschinen Daten sind key und sektion noch so benannt weil früher ini-Strukturen gelesen wurdenXMLdocument1.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; 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:
Hat jemand eine Lösung, evtl eine kleine Funktion wo mir hilft?
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; Gruß Matthias |
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. |
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 |
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? |
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 |
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. |
AW: Attribute auslesen
Ich glaube das war schon so gewollt:
Delphi-Quellcode:
liefert einen
IXMLNode::Attributes['someName']
Delphi-Quellcode:
und sein
OleVariant
Delphi-Quellcode:
(
NULL
Delphi-Quellcode:
) vergleicht damit.
System.Variants.Null()
Wäre mir aber auch zu abenteuerlich, ich hätte mit
Delphi-Quellcode:
geprüft und mir sonst keine weiteren Gedanken gemacht...
myXmlNode.HasAttribute('someName')
|
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 ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz