Evo nesto za pocetak, pa se ti igraj dalje :)
Code:
uses
ComObj,
MSXML;
procedure InsertMissingChildNode(
AParentNode: IXMLDOMNode;
AChildName : string;
AChildValue: string;
AChildLevel: integer = 1);
var
i: integer;
bFound: Boolean;
xmlNode: IXMLDOMNode;
begin
bFound := False;
Dec(AChildLevel);
//
for i := 0 to AParentNode.childNodes.length-1 do
begin
if (AChildLevel > 0) then
InsertMissingChildNode(
AParentNode.childNodes[i],
AChildName,
AChildValue,
AChildLevel
);
//
bFound := (bFound OR (AParentNode.childNodes[i].nodeName = AChildName));
end;
//
if ((not bFound)
and (AParentNode.nodeType = NODE_ELEMENT)
and (AChildLevel = 0)) then
begin
xmlNode := AParentNode.ownerDocument.createElement(AChildName);
if (AChildValue <> '') then
xmlNode.text := AChildValue;
//
AParentNode.appendChild(xmlNode);
end;
end;
Upotreba:
Code:
var
xmlDoc: IXMLDOMDocument;
xmlText: string;
begin
xmlText := '<root>'
+ ' <Main>Neki text'
+ ' <A>Neki text</A>'
+ ' <B>Neki text</B>'
+ ' </Main>'
+ ' <Main>Neki text'
+ ' <A>Neki text</A>'
// ovde nedostaje <B/>
+ ' </Main>'
+ '</root>';
//
xmlDoc := CreateOleObject('Microsoft.XMLDOM') as IXMLDOMDocument;
xmlDoc.preserveWhiteSpace := True;
xmlDoc.loadXML(xmlText);
//
InsertMissingChildNode(xmlDoc.firstChild, 'B', '', 2);
ShowMessage(xmlDoc.xml);
end;
Evo i rezultata u zavisnosti od parametra "AChildLevel":
Code:
Pocetni XML:
<root>
<Main>Neki text
<A>Neki text</A>
<B>Neki text</B>
</Main>
<Main>Neki text
<A>Neki text</A>
</Main>
</root>
Poziv: InsertMissingChildNode(xmlDoc.firstChild, 'B', '', 2);
Rezultat:
<root>
<Main>Neki text
<A>Neki text</A>
<B>Neki text</B>
</Main>
<Main>Neki text
<A>Neki text</A>
<B/> <-- dodati element (child level 2 u odnosu na root)
</Main>
</root>
Poziv: InsertMissingChildNode(xmlDoc.firstChild, 'B', '');
Rezultat:
<root>
<Main>Neki text
<A>Neki text</A>
<B>Neki text</B>
</Main>
<Main>Neki text
<A>Neki text</A>
</Main>
<B/> <-- dodati element (child level 1 u odnosu na root)
</root>
Poziv: InsertMissingChildNode(xmlDoc.firstChild, 'B', '', 3);
Rezultat:
<root>
<Main>Neki text
<A>Neki text
<B/> <-- dodati element (child level 3 u odnosu na root)
</A>
<B>Neki text
<B/> <-- dodati element (child level 3 u odnosu na root)
</B>
</Main>
<Main>Neki text
<A>Neki text
<B/> <-- dodati element (child level 3 u odnosu na root)
</A>
</Main>
</root>
Pozdrav, BugA