AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi createNode, IXMLDOMDocument - Node hinzufügen
Thema durchsuchen
Ansicht
Themen-Optionen

createNode, IXMLDOMDocument - Node hinzufügen

Ein Thema von schwa226 · begonnen am 5. Jul 2009 · letzter Beitrag vom 6. Jul 2009
Antwort Antwort
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#1

createNode, IXMLDOMDocument - Node hinzufügen

  Alt 5. Jul 2009, 19:57
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!?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#2

Re: createNode, IXMLDOMDocument - Node hinzufügen

  Alt 5. Jul 2009, 20:21
Zitat von schwa226:
Wo setze ich den Attributnamen? xmlns? Wie bekomme ich das "Delay" in den nodeValue?
pffffff, gute Frage

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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#3

Re: createNode, IXMLDOMDocument - Node hinzufügen

  Alt 5. Jul 2009, 21:11
Trotzdem Danke!

Habe es jetzt so hinbekommen :

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>
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#4

Re: createNode, IXMLDOMDocument - Node hinzufügen

  Alt 5. Jul 2009, 21:37
hab grad mal den Grund für den NameSpace gefunden ... der letzte Parameter bei doc.createNode ist nicht der Node-Inhalt


Delphi-Quellcode:
IXMLDOMDocument = interface(IXMLDOMNode)
  function createNode(type_: OleVariant; const name: WideString;
    const namespaceURI: WideString): IXMLDOMNode; safecall;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#5

Re: createNode, IXMLDOMDocument - Node hinzufügen

  Alt 5. Jul 2009, 23:20
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
xHTPCNoteNode := doc.selectSingleNode('//group[@Name="Programs"]'); den Program Node selektieren. Wenn ich aber nun versuche den program node direkt zu selektieren geht es nicht:
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?
  Mit Zitat antworten Zitat
TheFrog

Registriert seit: 24. Mär 2009
145 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: createNode, IXMLDOMDocument - Node hinzufügen

  Alt 6. Jul 2009, 09:50
Ich bin mir nicht sicher, aber ich musste in so einem Fall die SelectionLanguage setzen, dann ging's:

Doc.SetProperty('SelectionLanguage', 'XPath'); Hans.
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#7

Re: createNode, IXMLDOMDocument - Node hinzufügen

  Alt 6. Jul 2009, 12:39
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 = 'StartDelaythen
                  begin
                    xHTPCNodes.item[j].text := IntToStr(Delay);
                    Break;
                  end;
              end;
        end;
    end;
Umständlich, aber es geht!
  Mit Zitat antworten Zitat
Antwort Antwort


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 11: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