![]() |
Optionale Argumente in Nodes - wie behandeln ?
Hi Leute, baue gerade an einer Client-Server - Kommunikation über XML, dabei ist mein Syntax so definiert, dass es Optionale Atrribute gibt, die nicht immer gesetzt, bzw. vorhanden sind.
Greife ich nun z.b. mit
Delphi-Quellcode:
auf ein Atrribut zu, bekomme ich einen Fehler
str_id := xmlnode_f.Attributes['id'];
soll ich jetzt lieber so vorgehen, dass ich einen exeption drum bastle:
Delphi-Quellcode:
oder besser alle Attribute in einer for-Schleife mit anschließendem case-of abtasten und zuordnen ?
try
str_id := xmlnode_f.Attributes['id']; except str_id := ''; end; Mit ist es ja wesehntlich lieber das über die exception zu lösen, oder wäre das unsauber programmiert ? |
Re: Optionale Argumente in Nodes - wie behandeln ?
Hallo,
du kannst vor einem Direktzugriff prüfen:
Delphi-Quellcode:
Es geht aber auch noch einfacher:
with node do
if HasAttribute(aName) then aValue := node.Attributes[aName] else aValue := '';
Delphi-Quellcode:
try-except ist hier mit Abstand die schlechteste Lösung.
aValue := VarToStr(node.Attributes[aName]);
Grüße vom marabu |
Re: Optionale Argumente in Nodes - wie behandeln ?
die hasattribute - methode is ja zimich cool, nur wie kann ich prüfen ob ein xmldocument eien child hat ?
gibts sowas wie xml.haschild('bla')? |
Re: Optionale Argumente in Nodes - wie behandeln ?
Hallo,
jeder Knoten hat die Methode HasChildNodes, aber um auf die Existenz eines benannten Knoten zu prüfen kannst du einfach ChildNodes['wossname'] auf nil prüfen. Noch mächtiger ist die Verwendung von IDOMNodeSelect und XPath. Gute Nacht |
Re: Optionale Argumente in Nodes - wie behandeln ?
Hallo und Frohe Weihnachten,
Ich habe ein Problem mit IXMLNode Elementen ich deklariere schön brav meine Nodes und öffne mein xml Document.
Delphi-Quellcode:
Dann versuche ich die Konoten meines Files zu durchlaufen. Beim ersten Knoten (=#document) klappt auch noch alles wie erwartet. HasChildnodes ist true und somit kann ich den ersten Kindknoten umkopieren und ihn mit cNode (=Childnode) referenzieren.
var
iNode : IXMLNode; tNode : IXMLNode; cNode : IXMLNode; Auch hier bekomme ich noch den Namen des ersten Kindes (=root). Jetzt wirds kurios: Der ChildNode lierfert true bei haschildnodes, wenn ich dann den ersten Kindknoten in tNode kopieren möchte fliegt mir eine EAccessViolation um die Ohren. Warum?
Delphi-Quellcode:
PS.: Ich habe es auch schon ohne CloneNode(true) versucht und es klappt ebensowenig wie mit cNode.ChildNodes[0] ...
if(iNode.HasChildNodes)then
begin cNode := iNode.ChildNodes.First.CloneNode(true); tmp := cNode.NodeName; if(cNode.HasChildNodes) then begin tNode := cNode.ChildNodes.First; tmp := tNode.NodeName; Wäre echt super wenn mir einer von euch weiterhelfen könnte. Tausend dank schonmal |
Re: Optionale Argumente in Nodes - wie behandeln ?
Herzlich willkommen in der Delphi-PRAXiS, aegidos.
Der von dir gezeigte Code selbst ist nicht fehlerhaft, auch wenn er so für sich genommen nicht viel Sinn macht. Wo tritt denn die Zugriffsverletzung genau auf? Vermutlich funktioniert die Zuweisung an tNode noch korrekt, aber der Zugriff auf tNode.NodeName nicht mehr, weil tNode auf nil gesetzt wurde. Vielleicht solltest du beschreiben, was du wirklich erreichen willst und nicht, was du schon alles ausprobiert hast. Wenn gar nichts hilft, dann musst du mal deine Testdaten und den vollständigen Code zeigen, damit man das Problem nachstellen kann. Auch für dich Frohe Weihnachten. |
Re: Optionale Argumente in Nodes - wie behandeln ?
Hallo,
Kurze Erklärung zu meinem Vorhaben: Ich versuche ein Dokument zu durchlaufen welches folgendermaßen aufgebaut ist:
Delphi-Quellcode:
Wenn ich diese Datei durchlaufe weis ich eine ID nach der ich suche habe ich selbige gefunden möchte ich den "Text" und die erforderliche "action" in einem Dialog ausegeben.
<errors>
<error id='1'> <text> Fehler auf Platine AXY123 </text> <action> Bitte resetten sie die Platine AXY123 und starten Sie die Anwendung neu </action> </error> <error id='2'> <text> Fehler an Poti 4</text> <action> Bitte tauschen Sie das Potentiometer 4</action> </error> </errors> Die Beschriebene Exception schlägt hier auf:
Delphi-Quellcode:
Und das ist der Punkt den ich nicht verstehe. Wenn doch der Knoten "error" sogar 2 Unterknoten "action" und "text" hat, warum bekomme ich dann diese Fehlermeldung?
tNode := cNode.ChildNodes.First;
Derzeit versuche ich die Problematik zu umgehen indem ich anstelle von IXMLNodes jetzt eine IDOMNodeList und ein IDOMNodeEx nutze. Schöne Grüße Andi |
Re: Optionale Argumente in Nodes - wie behandeln ?
Hallo und frohe Weihnachten auch von mir.
Ich würde folgendermaßen an das Problem rangehen: Nutze XPath und du kommst mit wenigen Zeilen Code aus. Deinen gewollten Error-Node bekommst du über:
Delphi-Quellcode:
An Text und Action kommst du dann ganz bequem über:
aErrorNode := myDocument.documentElement.selectSingleNode( 'error[id="123"]' );
Delphi-Quellcode:
Gruß
aTextNode := aErrorNode.selectSingleNode( 'text' );
if ( nil <> aTextNode ) then sText := aTextNode.text; ... für Action das Selbe in grün ... |
Re: Optionale Argumente in Nodes - wie behandeln ?
Ein gesundes neues!
Sorry das ich mich jetzt erst melde aber da war ein Winterurlaub dazwischen :-D Super großes Dankeschön für die schnelle Hilfe es hat auch alles funktioniert. Warum jedoch mein alter Code nicht funktioniert hat weiß ich immernoch nicht. Konnte den Fehler nicht finden ist mir aber jetz auch egal nachdem es ja funktioniert. Dankeschön nochmals! |
Re: Optionale Argumente in Nodes - wie behandeln ?
Zitat:
Delphi-Quellcode:
hätte eigentlich heißen müssen:
aErrorNode := myDocument.documentElement.selectSingleNode( 'error[id="123"]' );
Delphi-Quellcode:
Aber nix für ungut, ich gehe mal davon aus, du hast den Bug selbst schon gefixt.
aErrorNode := myDocument.documentElement.selectSingleNode( 'error[@id="123"]' );
Gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:16 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