Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi createNode, IXMLDOMDocument - Node hinzufügen (https://www.delphipraxis.net/136672-createnode-ixmldomdocument-node-hinzufuegen.html)

schwa226 5. Jul 2009 18:57


createNode, IXMLDOMDocument - Node hinzufügen
 
Hi,

ich bekomme es einfach nicht gebacken mit dem XML!

Ich habe hier ein XML:
Code:
   <group Name="Programs">
      <program location="C:\windows\notepad.exe">
         <StartDelay>5</StartDelay>
      </program>
   </group>
Nun möchte ich ein weiteres Programm hinzufügen.
So z.B:
Code:
   <group Name="Programs">
      <program location="C:\windows\notepad.exe">
         <StartDelay>5</StartDelay>
      </program>
      <program location="C:\windows\mspaint.exe">
         <StartDelay>5</StartDelay>
      </program>      
   </group>
Nun versuche ich die ganze Zeit mit createNode das hinzuzufügen, klappt aber nicht!

Delphi-Quellcode:
function AddNodeToXML(const XmlFilePath: string; AppPath: String; Delay : Integer): boolean;
var
  doc: IXMLDOMDocument;
  xHTPCNoteNode, xHTPCNodeChild: IXMLDOMNode;
  xHTPCNodes: IXMLDOMNodeList;
begin

  doc := CoDOMDocument.Create;
  with doc do
  begin
    async := false;
    load(XmlFilePath); // can fail
  end;

  xHTPCNoteNode := doc.selectSingleNode('//group[@Name="Programs"]');

  xHTPCNoteNode := xHTPCNoteNode.appendChild(doc.createNode(NODE_ELEMENT, 'program', AppPath));

  doc.save(XmlFilePath);
end;
rauskommen tut aber:
Code:
   <group Name="Programs">
      <program location="C:\windows\notepad.exe">
         <StartDelay>5</StartDelay>
      </program>
            <program xmlns="c:\windows\mspaint.exe">
         <StartDelay xmlns="5"/>
      </program>
   </group>
Wo setze ich den Attributnamen? xmlns? Wie bekomme ich das "Delay" in den nodeValue?

Kann mir da jemand helfen!?

himitsu 5. Jul 2009 19:21

Re: createNode, IXMLDOMDocument - Node hinzufügen
 
Zitat:

Zitat von schwa226
Wo setze ich den Attributnamen? xmlns? Wie bekomme ich das "Delay" in den nodeValue?

pffffff, gute Frage :shock:

du kannst aber gern mal in die demos/CheckLib.dpr in Hier im Forum suchenhimXML reinsehen,
da hab ich's geschaft mit MSXML Nodes und Attribute so zu erstellen, wie ich es mir auch vorstelle.

aber ganz ehrlich ... ich seh bei dem "Ding" auch nicht immer durch
und mit den "Basis"-Interfaces hab ich noch weniger hinbekommen.
(in der Demo hab ich TXMLDocument genutzt und bin darüber gegangen)


ansonsten kann ich nichtmal erkennen wo du Delay innerhalb deiner AddNodeToXML-Prozedur erstellst/zuweist ... ich könnte sogar fast schwören, daß dieses dort garnicht im Code vorkommt (außer in den Parametern)

[add]
bei IXMLNode gibt es eine Prozedur Namens .AddChild, womit man SubNodes erstellen kann und via .Text wird der Inhalt zugewiesen.

schwa226 5. Jul 2009 20:11

Re: createNode, IXMLDOMDocument - Node hinzufügen
 
Trotzdem Danke!

Habe es jetzt so hinbekommen :cyclops: :cyclops: :

Delphi-Quellcode:
  xHTPCNoteNode := doc.selectSingleNode('//group[@Name="Programs"]');

  xHTPCNoteNode := xHTPCNoteNode.appendChild(doc.createElement('program'));

  xHTPCNoteNode.attributes.setNamedItem(doc.createAttribute('location'));
  xHTPCNoteNode.attributes.getNamedItem('location').nodeValue := AppPath;

  xHTPCNoteNode := xHTPCNoteNode.appendChild(doc.createElement('StartDelay'));
  xHTPCNoteNode.text := IntToStr(Delay);
Result:
Code:
      <program location="c:\windows\notepad.exe">
         <StartDelay>5</StartDelay>
      </program>

himitsu 5. Jul 2009 20:37

Re: createNode, IXMLDOMDocument - Node hinzufügen
 
hab grad mal den Grund für den NameSpace gefunden ... der letzte Parameter bei doc.createNode ist nicht der Node-Inhalt :nerd:


Delphi-Quellcode:
IXMLDOMDocument = interface(IXMLDOMNode)
  function createNode(type_: OleVariant; const name: WideString;
    const namespaceURI: WideString): IXMLDOMNode; safecall;

schwa226 5. Jul 2009 22:20

Re: createNode, IXMLDOMDocument - Node hinzufügen
 
Ich habe nun noch eine kleine Frage dazu:

xml
Code:
   <group Name="Programs">
      <program location="C:\WINDOWS\notepad.exe">
      <StartDelay>5</StartDelay>
      </program>
      </group>
kann ich ohne Probleme per
Delphi-Quellcode:
xHTPCNoteNode := doc.selectSingleNode('//group[@Name="Programs"]');
den Program Node selektieren. Wenn ich aber nun versuche den program node direkt zu selektieren geht es nicht:
Delphi-Quellcode:
xHTPCNoteNode := doc.selectSingleNode('//group[@Name="Programs"]/program[@location="C:\WINDOWS\notepad.exe"]);
Warum geht das schon wieder nicht?

Oder muss ich alle childNodes durchsteppen bis der richtige gefunden wurde?

TheFrog 6. Jul 2009 08:50

Re: createNode, IXMLDOMDocument - Node hinzufügen
 
Ich bin mir nicht sicher, aber ich musste in so einem Fall die SelectionLanguage setzen, dann ging's:

Delphi-Quellcode:
Doc.SetProperty('SelectionLanguage', 'XPath');
Hans.

schwa226 6. Jul 2009 11:39

Re: createNode, IXMLDOMDocument - Node hinzufügen
 
SetProperty habe ich nicht gefunden..

habe es jetzt so gelöst:
Delphi-Quellcode:
  //select Programs node:
  xHTPCNodes := doc.selectSingleNode('//group[@Name="Programs"]').childNodes;

  for i := 0 to xHTPCNodes.length - 1 do
    begin
      if xHTPCNodes.item[i].attributes.getNamedItem('location').text = ProgramList[index].ProgramLocation then
        begin
          xHTPCNodes := xHTPCNodes.item[i].childNodes;
            for j := 0 to xHTPCNodes.length - 1 do
              begin
                if xHTPCNodes.item[j].nodeName = 'StartDelay' then
                  begin
                    xHTPCNodes.item[j].text := IntToStr(Delay);
                    Break;
                  end;
              end;
        end;
    end;
Umständlich, aber es geht!


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