[gelöst] Fehler im XML-Tutorial?

Rund um die LCL und andere Komponenten
Antworten
Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

[gelöst] Fehler im XML-Tutorial?

Beitrag von Linkat »

Hallo,
zur Zeit muss ich mich mit XML auseinander setzen. Hierzu nutze ich das XML-Tutorial vom Lazarus-Wiki:
http://wiki.freepascal.org/XML_Tutorial/de

In dem Beispiel XML2Tree:

Code: Alles auswählen

procedure TForm1.XML2Tree(tree: TTreeView; XMLDoc: TXMLDocument);
var
  iNode: TDOMNode;
 
  procedure ProcessNode(Node: TDOMNode; TreeNode: TTreeNode);
  var
    cNode: TDOMNode;
  begin
    if Node = nil then Exit; // Aufhören, wenn ein Blatt erreicht ist
 
    // Einen Knoten zum Baum hinzufügen
    TreeNode := tree.Items.AddChild(TreeNode, Node.Attributes[0].NodeValue);  <---- Hier tritt der Fehler auf
 
    // Zum Kindknoten weiter gehen
    cNode := Node.ChildNodes.Item[0];
 
    // Alle Kindknoten bearbeiten
    while cNode <> nil do
    begin
      ProcessNoDe(cNode, TreeNode);
      cNode := cNode.NextSibling;
    end;
  end;
 
begin
  iNode := XMLDoc.DocumentElement.ChildNodes.Item[0];
  while iNode <> nil do
  begin
    ProcessNode(iNode, nil); // Rekursiv
    iNode := iNode.NextSibling;
  end;
end;
tritt an der markierten Stelle (Knoten zum Baum hinzufügen) die Fehlermeldung:

Code: Alles auswählen

Projekt hat Exception Klasse >> External: SIGSEGV << ausgelöst.
auf.

Wer erkennt das Problem, und kann mir weiterhelfen.

Vielen Dank.

Gruß, Linkat
Zuletzt geändert von Linkat am Mi 19. Okt 2011, 13:40, insgesamt 1-mal geändert.
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Fehler im XML-Tutorial?

Beitrag von Socke »

Code: Alles auswählen

// Einen Knoten zum Baum hinzufügen
    TreeNode := tree.Items.AddChild(TreeNode, Node.Attributes[0].NodeValue);  //<---- Hier tritt der Fehler auf
Vermutlich hat der Knoten Node keine Attribute.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: Fehler im XML-Tutorial?

Beitrag von Linkat »

Hallo Socke,
sowohl mit dem Beispiel aus dem Tutorial,

Code: Alles auswählen

<?xml version="1.0"?>
 <images directory="mydir">
  <imageNode URL="graphic.jpg" title="">
    <Peca DestinoX="0" DestinoY="0">Pecacastelo.jpg1.swf</Peca>
    <Peca DestinoX="0" DestinoY="86">Pecacastelo.jpg2.swf</Peca>
  </imageNode>
 </images>
als auch mit diesem

Code: Alles auswählen

<?xml version="1.0"?>
<E>
  <E1>
    <E1K1>
	  <E11>PUT_FILE</E11>
    </E1K1>
    <E1K2>123</E1K2>
    <E1K3>abc</E1K3>
    <E1K4>DIE</E1K4>
  </E1>
  <E2>
    <E2K1>PUT</E2K1>
    <E2K2>456</E2K2>
    <E2K3>def</E2K3>
    <E2K4>REDHT</E2K4>
  </E2>
</E>
tritt der Fehler auf.

Gruß, Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: Fehler im XML-Tutorial?

Beitrag von Linkat »

Ja Socke du hattest recht. Zufällig bin ich in der englischsprachigen Ausgabe des XML-Tutorials gelandet. Da ist das Problem tatsächlich gefixt.

In der zusätzlichen if-then-else Verzweigung wird überprüft, ob überhaupt ein Attribut vorhanden ist.

Code: Alles auswählen

procedure ProcessNode(Node: TDOMNode; TreeNode: TTreeNode);
  var
    cNode: TDOMNode;
    s: string;
  begin
    if Node = nil then Exit; // Stops if reached a leaf
 
    // Adds a node to the tree
    if Node.HasAttributes and (Node.Attributes.Length>0) then  //diese if-then-else Verzweigung ist neu
      s := Node.Attributes[0].NodeValue                                      
    else
      s := ''; 
    TreeNode := tree.Items.AddChild(TreeNode, s);


Nun läuft das Programm.
Vielen Dank

Gruß, Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Fehler im XML-Tutorial?

Beitrag von Socke »

Code: Alles auswählen

if Node.HasAttributes and (Node.Attributes.Length>0) then  //diese if-then-else Verzweigung ist neu
Ich bin da nicht mehr so ganz fit, aber wozu ist hier die Abfrage über Node.Attributes.Length da? Meiner Meinung nach reicht der erste Teil aus.

Edit: Ich habs mal im wiki korrigiert.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten