Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Prism xml-node-attribute (https://www.delphipraxis.net/59115-xml-node-attribute.html)

salem01 17. Dez 2005 16:32


xml-node-attribute
 
hallo zusammen,
mal wieder wende ich mich an euch :shock: .

ich habe die xml-datei attribute.xml und versuche über eine delphi fkt. (durch button-klick) einen knoten mit seinen unterknoten zu kopieren und anzuhängen wobei das attribut id immer um eins erhöht werden soll (also alles eins zu eins kopieren mit einer inkrementierten id!).
die xml-struktur sieht folgerndermassen aus:
XML-Code:
<attribute>
  <stammdaten id="0">
    .....
  </stammdaten>
  ......
  <autodaten id="0">
    .....
  </autodaten>
  ......
</attribute>
meine dalphi-6-fkt sieht so aus:
Delphi-Quellcode:
function FahrzeugRecordAnlegen(var attributeXML: string): String;
 var
   XMLDOMAttribute : IXMLDOMDocument;
   XMLDOMAutoDatenNode : IXMLDOMNode;
   XMLDOMAutoDatenNodeNeu : IXMLDOMNode;
   XMLDOMNodeListIDs: IXMLDOMNodeList;
   XMLDOMNodeId : IXMLDOMNode;
   newID : integer;
begin

  XMLDOMAttribute := CoDOMDocument40.Create;
  XMLDOMAttribute.async := false;
  XMLDOMAttribute.loadXML(attributeXML);

  XMLDOMNodeListIDs := XMLDOMAttribute.selectNodes('//autodaten/@id');
  XMLDOMNodeId := XMLDOMNodeListIDs.nextNode();
   newID:= 0;

  while(NOT(XMLDOMNodeId=NIL)) do
  begin
    if(StrToInt(XMLDOMNodeId.nodeTypedValue) > newID) then
    begin
      newID := StrToInt(XMLDOMNodeId.nodeTypedValue);
    end;
    XMLDOMNodeId := XMLDOMNodeListIDs.nextNode();
  end;
   newID := newID+1;

   XMLDOMAutoDatenNode:= XMLDOMAttribute.selectSingleNode('//autodaten');
   XMLDOMAutoDatenNodeNeu:= XMLDOMAutoDatenNode.cloneNode(true);

   XMLDOMAutoDatenNodeNeu.selectSingleNode('//autodaten/@id').text := IntToStr(newID);

   XMLDOMAttribute.selectSingleNode('/attribute').appendChild(XMLDOMAutoDatenNodeNeu);

  result := XMLDOMAttribute.xml;
 end;
ich habe dadurch folgendes ergebnis erhofft
XML-Code:
<attribute>
  <stammdaten id="0">
    .....
  </stammdaten>
  ......
  <autodaten id="0">
    .....
  </autodaten>
  <autodaten id="1">
    .....
  </autodaten>
  ......
</attribute>
bekomme aber leider die fehlermeldung
Delphi-Quellcode:
Zugriffsverletzung bei Adresse 004BA08D in Modul 'PCapi.exe'. Lesen von Adresse 00000000
benutze ich in delphi irgend eine falsche methode? ich habe es auch mit
XMLDOMAutoDatenNodeNeu.selectSingleNode('//autodaten/@id').nodeValue := IntToStr(newID);
ausprobiert, aber leider auch ohne erfolg :cry: .

danke im vorraus.
LG.

marabu 17. Dez 2005 17:07

Re: xml-node-attribute
 
Hallo salem01,

hier ein wenig ungetester Code für dich zum Studieren. Du schreibst von D6 und hast deinen thread unter .NET klassifiziert - scheint ein Versehen zu sein.

Delphi-Quellcode:
function FahrzeugRecordAnlegen(var xml: string): string;
var
  doc: IXMLDOMDocument;
  nLast, nSucc: IXMLDOMNode;
  nextID: integer;
begin
  doc := CoDOMDocument.Create;
  with doc do
  begin
    async := false;
    loadXML(xml); // can fail
  end;

  nLast := doc.selectSingleNode('//autodaten[last()]');
  if Assigned(nLast) then
  begin
    with nLast as IXMLDOMElement do
      nextID := getAttribute('id');
    with nLast do
      nSucc := cloneNode(true) as IXMLDOMElement;;
    with nLast as IXMLDOMElement do
      setAttribute('id', IntToStr(nextID));
    nLast.parentNode.appendChild(nSucc);
  end else
  begin
    // your turn now
  end;
  Result := doc.xml;
end;
Grüße vom marabu

salem01 17. Dez 2005 18:13

Re: xml-node-attribute
 
danke marabu,
sorry das ich .net ausgewählt habe, wie du sagtest, ausversehen.
habe jetzt was von deinem code verwendet, das das problem gelöst hat, und es tut :) .

danke nochmals.
Gruß.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:13 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