AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi Optionale Argumente in Nodes - wie behandeln ?
Thema durchsuchen
Ansicht
Themen-Optionen

Optionale Argumente in Nodes - wie behandeln ?

Ein Thema von meisteralex · begonnen am 30. Sep 2007 · letzter Beitrag vom 9. Jan 2008
Antwort Antwort
Seite 1 von 2  1 2      
meisteralex

Registriert seit: 22. Nov 2005
173 Beiträge
 
#1

Optionale Argumente in Nodes - wie behandeln ?

  Alt 30. Sep 2007, 11:18
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

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 ?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Optionale Argumente in Nodes - wie behandeln ?

  Alt 30. Sep 2007, 11:37
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:

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

Grüße vom marabu
  Mit Zitat antworten Zitat
meisteralex

Registriert seit: 22. Nov 2005
173 Beiträge
 
#3

Re: Optionale Argumente in Nodes - wie behandeln ?

  Alt 10. Okt 2007, 06:55
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')?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Optionale Argumente in Nodes - wie behandeln ?

  Alt 11. Okt 2007, 22:00
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
  Mit Zitat antworten Zitat
aegidos

Registriert seit: 30. Okt 2007
40 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Optionale Argumente in Nodes - wie behandeln ?

  Alt 20. Dez 2007, 06:52
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Optionale Argumente in Nodes - wie behandeln ?

  Alt 20. Dez 2007, 08:08
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.
  Mit Zitat antworten Zitat
aegidos

Registriert seit: 30. Okt 2007
40 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Optionale Argumente in Nodes - wie behandeln ?

  Alt 20. Dez 2007, 13:08
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:
 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
  Mit Zitat antworten Zitat
Neuromancer

Registriert seit: 8. Aug 2003
62 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Optionale Argumente in Nodes - wie behandeln ?

  Alt 20. Dez 2007, 17:24
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:
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ß
  Mit Zitat antworten Zitat
aegidos

Registriert seit: 30. Okt 2007
40 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Optionale Argumente in Nodes - wie behandeln ?

  Alt 8. Jan 2008, 07:54
Ein gesundes neues!
Sorry das ich mich jetzt erst melde aber da war ein Winterurlaub dazwischen
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!
  Mit Zitat antworten Zitat
Neuromancer

Registriert seit: 8. Aug 2003
62 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Optionale Argumente in Nodes - wie behandeln ?

  Alt 8. Jan 2008, 08:06
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...

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

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ß
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 16:17 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