![]() |
createNode, IXMLDOMDocument - Node hinzufügen
Hi,
ich bekomme es einfach nicht gebacken mit dem XML! Ich habe hier ein XML:
Code:
Nun möchte ich ein weiteres Programm hinzufügen.
<group Name="Programs">
<program location="C:\windows\notepad.exe"> <StartDelay>5</StartDelay> </program> </group> So z.B:
Code:
Nun versuche ich die ganze Zeit mit createNode das hinzuzufügen, klappt aber nicht!
<group Name="Programs">
<program location="C:\windows\notepad.exe"> <StartDelay>5</StartDelay> </program> <program location="C:\windows\mspaint.exe"> <StartDelay>5</StartDelay> </program> </group>
Delphi-Quellcode:
rauskommen tut aber:
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;
Code:
Wo setze ich den Attributnamen? xmlns? Wie bekomme ich das "Delay" in den nodeValue?
<group Name="Programs">
<program location="C:\windows\notepad.exe"> <StartDelay>5</StartDelay> </program> <program xmlns="c:\windows\mspaint.exe"> <StartDelay xmlns="5"/> </program> </group> Kann mir da jemand helfen!? |
Re: createNode, IXMLDOMDocument - Node hinzufügen
Zitat:
du kannst aber gern mal in die demos/CheckLib.dpr in ![]() 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. |
Re: createNode, IXMLDOMDocument - Node hinzufügen
Trotzdem Danke!
Habe es jetzt so hinbekommen :cyclops: :cyclops: :
Delphi-Quellcode:
Result:
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);
Code:
<program location="c:\windows\notepad.exe">
<StartDelay>5</StartDelay> </program> |
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; |
Re: createNode, IXMLDOMDocument - Node hinzufügen
Ich habe nun noch eine kleine Frage dazu:
xml
Code:
kann ich ohne Probleme per
<group Name="Programs">
<program location="C:\WINDOWS\notepad.exe"> <StartDelay>5</StartDelay> </program> </group>
Delphi-Quellcode:
den Program Node selektieren. Wenn ich aber nun versuche den program node direkt zu selektieren geht es nicht:
xHTPCNoteNode := doc.selectSingleNode('//group[@Name="Programs"]');
Delphi-Quellcode:
Warum geht das schon wieder nicht?
xHTPCNoteNode := doc.selectSingleNode('//group[@Name="Programs"]/program[@location="C:\WINDOWS\notepad.exe"]);
Oder muss ich alle childNodes durchsteppen bis der richtige gefunden wurde? |
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:
Hans.
Doc.SetProperty('SelectionLanguage', 'XPath');
|
Re: createNode, IXMLDOMDocument - Node hinzufügen
SetProperty habe ich nicht gefunden..
habe es jetzt so gelöst:
Delphi-Quellcode:
Umständlich, aber es geht!
//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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz