Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Optionale Argumente in Nodes - wie behandeln ? (https://www.delphipraxis.net/100554-optionale-argumente-nodes-wie-behandeln.html)

meisteralex 30. Sep 2007 11:18


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:
str_id := xmlnode_f.Attributes['id'];
auf ein Atrribut zu, bekomme ich einen Fehler

soll ich jetzt lieber so vorgehen, dass ich einen exeption drum bastle:

Delphi-Quellcode:
  try
    str_id := xmlnode_f.Attributes['id'];
  except
    str_id := '';
  end;
oder besser alle Attribute in einer for-Schleife mit anschließendem case-of abtasten und zuordnen ?

Mit ist es ja wesehntlich lieber das über die exception zu lösen, oder wäre das unsauber programmiert ?

marabu 30. Sep 2007 11:37

Re: Optionale Argumente in Nodes - wie behandeln ?
 
Hallo,

du kannst vor einem Direktzugriff prüfen:

Delphi-Quellcode:
with node do
  if HasAttribute(aName)
    then aValue := node.Attributes[aName]
    else aValue := '';
Es geht aber auch noch einfacher:

Delphi-Quellcode:
aValue := VarToStr(node.Attributes[aName]);
try-except ist hier mit Abstand die schlechteste Lösung.

Grüße vom marabu

meisteralex 10. Okt 2007 06:55

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')?

marabu 11. Okt 2007 22:00

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

aegidos 20. Dez 2007 06:52

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:
var
  iNode : IXMLNode;
  tNode : IXMLNode;
  cNode : IXMLNode;
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.
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:
   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;
PS.: Ich habe es auch schon ohne CloneNode(true) versucht und es klappt ebensowenig wie mit cNode.ChildNodes[0] ...

Wäre echt super wenn mir einer von euch weiterhelfen könnte.
Tausend dank schonmal

marabu 20. Dez 2007 08:08

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.

aegidos 20. Dez 2007 13:08

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:
<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>
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.
Die Beschriebene Exception schlägt hier auf:
Delphi-Quellcode:
 tNode := cNode.ChildNodes.First;
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?
Derzeit versuche ich die Problematik zu umgehen indem ich anstelle von IXMLNodes jetzt eine IDOMNodeList und ein IDOMNodeEx nutze.
Schöne Grüße
Andi

Neuromancer 20. Dez 2007 17:24

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:
aErrorNode := myDocument.documentElement.selectSingleNode( 'error[id="123"]' );
An Text und Action kommst du dann ganz bequem über:
Delphi-Quellcode:
aTextNode := aErrorNode.selectSingleNode( 'text' );
if ( nil <> aTextNode ) then
  sText := aTextNode.text;

... für Action das Selbe in grün ...
Gruß

aegidos 8. Jan 2008 07:54

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!

Neuromancer 8. Jan 2008 08:06

Re: Optionale Argumente in Nodes - wie behandeln ?
 
Zitat:

Zitat von aegidos
jetz auch egal nachdem es ja funktioniert.

Tatsächlich? Ich habe eben nämlich noch einen kleinen Fehler entdeckt, eigentlich hätte mein Code gar nicht funktionieren dürfen...

Delphi-Quellcode:
aErrorNode := myDocument.documentElement.selectSingleNode( 'error[id="123"]' );
hätte eigentlich heißen müssen:

Delphi-Quellcode:
aErrorNode := myDocument.documentElement.selectSingleNode( 'error[@id="123"]' );
Aber nix für ungut, ich gehe mal davon aus, du hast den Bug selbst schon gefixt.

Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:39 Uhr.
Seite 1 von 2  1 2      

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