129 lines
2.9 KiB
Plaintext
129 lines
2.9 KiB
Plaintext
|
unit XMLUtils;
|
||
|
|
||
|
interface
|
||
|
uses
|
||
|
SysUtils, MSXML_TLB, ORFn;
|
||
|
|
||
|
function Text2XML(const AText: string): string;
|
||
|
function FindXMLElement(Element: IXMLDOMNode; ElementTag: string): IXMLDOMNode;
|
||
|
function FindXMLAttributeValue(Element: IXMLDOMNode; AttributeTag: string): string;
|
||
|
function GetXMLWPText(Element: IXMLDOMNode): string;
|
||
|
|
||
|
implementation
|
||
|
|
||
|
type
|
||
|
TXMLChars = (xcAmp, xcGT, xcLT, xcApos, xcQuot); // Keep & first in list!
|
||
|
|
||
|
const
|
||
|
XMLCnvChr: array[TXMLChars] of string = ('&', '>', '<', '''', '"');
|
||
|
XMLCnvStr: array[TXMLChars] of string = ('&','>','<',''','"');
|
||
|
|
||
|
function Text2XML(const AText: string): string;
|
||
|
var
|
||
|
i: TXMLChars;
|
||
|
p: integer;
|
||
|
tmp: string;
|
||
|
|
||
|
begin
|
||
|
Result := AText;
|
||
|
for i := low(TXMLChars) to high(TXMLChars) do
|
||
|
begin
|
||
|
tmp := Result;
|
||
|
Result := '';
|
||
|
repeat
|
||
|
p := pos(XMLCnvChr[i],tmp);
|
||
|
if(p > 0) then
|
||
|
begin
|
||
|
Result := Result + copy(tmp,1,p-1) + XMLCnvStr[i];
|
||
|
delete(tmp,1,p);
|
||
|
end;
|
||
|
until(p=0);
|
||
|
Result := Result + tmp;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
function FindXMLElement(Element: IXMLDOMNode; ElementTag: string): IXMLDOMNode;
|
||
|
var
|
||
|
Children: IXMLDOMNodeList;
|
||
|
Child: IXMLDOMNode;
|
||
|
i, count: integer;
|
||
|
|
||
|
begin
|
||
|
Result := nil;
|
||
|
Children := Element.Get_childNodes;
|
||
|
if assigned(Children) then
|
||
|
begin
|
||
|
count := Children.Get_length;
|
||
|
for i := 0 to count-1 do
|
||
|
begin
|
||
|
Child := Children.Get_item(i);
|
||
|
if assigned(Child) and (CompareText(Child.Get_nodeName, ElementTag) = 0) then
|
||
|
begin
|
||
|
Result := Child;
|
||
|
break;
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
function FindXMLAttributeValue(Element: IXMLDOMNode; AttributeTag: string): string;
|
||
|
var
|
||
|
Attributes: IXMLDOMNamedNodeMap;
|
||
|
Attribute: IXMLDOMNode;
|
||
|
i, count: integer;
|
||
|
|
||
|
begin
|
||
|
Result := '';
|
||
|
Attributes := Element.Get_attributes;
|
||
|
try
|
||
|
if assigned(Attributes) then
|
||
|
begin
|
||
|
count := Attributes.Get_Length;
|
||
|
for i := 0 to Count - 1 do
|
||
|
begin
|
||
|
Attribute := Attributes.Item[i];
|
||
|
if CompareText(Attribute.Get_NodeName, AttributeTag) = 0 then
|
||
|
begin
|
||
|
Result := Attribute.Get_Text;
|
||
|
break;
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
finally
|
||
|
Attribute := nil;
|
||
|
Attributes := nil;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
function GetXMLWPText(Element: IXMLDOMNode): string;
|
||
|
var
|
||
|
Children: IXMLDOMNodeList;
|
||
|
Child: IXMLDOMNode;
|
||
|
i, count: integer;
|
||
|
|
||
|
begin
|
||
|
Result := '';
|
||
|
Children := Element.Get_childNodes;
|
||
|
try
|
||
|
if assigned(Children) then
|
||
|
begin
|
||
|
count := Children.Length;
|
||
|
for i := 0 to Count - 1 do
|
||
|
begin
|
||
|
Child := Children.Item[i];
|
||
|
if CompareText(Child.NodeName, 'P') = 0 then
|
||
|
begin
|
||
|
if(Result <> '') then
|
||
|
Result := Result + CRLF;
|
||
|
Result := Result + Child.Get_Text;
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
finally
|
||
|
Child := nil;
|
||
|
Children := nil;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
end.
|