Hallo,
ich versuche mittels IXMLDOMDocument2 ein
XML-Document zu parsen.
Code:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
aXMLDocument: IXMLDomDocument2;
aXMLDE: IXMLDOMNode;
i: integer;
begin
aXMLDocument := CoDOMDocument40.Create;
if not aXMLDocument.loadXML('
<?xml version="1.0" encoding="iso-8859-1"?>' +
'
<root>' + #13#10 + '
' +
'
<ebene1>' + #13#10 + '
Hallo Welt</ebene1>' +
'
Hallo Welt 2' +
'
</root>')
then
begin
ShowMessage('
No valid XML document!');
Exit;
end;
aXMLDocument.setProperty('
NewParser', True);
ShowMessage( aXMLDocument.xml );
aXMLDE := aXMLDocument.documentElement;
ShowMessage('
childNodes->length: ' + IntToStr( aXMLDE.childNodes.length ));
EraseAllWhitespaces(aXMLDE);
ShowMessage( aXMLDocument.xml );
end;
Problem: der MS-Parser erkennt den TextNode direkt unter <root> nicht, obwohl ausdrücklich ein CRLF (#13#10)
und noch zusätzlich ein Leerzeichen als Text definiert sind.
Die Ausgabe
ShowMessage('childNodes->length: ' + IntToStr( aXMLDE.childNodes.length ));
ergibt dann fälschlicherweise 2, obwohl eigentlich 3 Nodes zurückgegeben werden müssten.
Folglich arbeitet die rekursive Funktion EraseAllWhitespaces
Delphi-Quellcode:
procedure TForm1.EraseAllWhitespaces(const ANode: IXMLDOMNode);
var
i: integer;
begin
for i := 0 to ANode.childNodes.length - 1 do
begin
if ( ANode.childNodes.item[i].nodeType = NODE_TEXT ) then
begin
ANode.childNodes.item[i].text := trim( ANode.childNodes.item[i].text );
end;
if ( ANode.childNodes.item[i].nodeType = NODE_ELEMENT ) then
begin
EraseAllWhitespaces( ANode.childNodes.item[i] );
end;
end;
end;
nicht richtig, weil der besagte Node nicht als TextNode erkannt wird.
Ein Test in PHP bestätigt mir, dass der o.a. Node eigentlich als TextNode erkannt werden muss, denn die folgende PHP-Funktion liefert mir das richtige Ergebnis, nämlich 3 Nodes (2 x Text und 1 x Element):
Code:
$sXML = '';
$sXML = "<?
xml version=\"1.0\" encoding=\"iso-8859-1\"?>" .
"<root>" . "
{;}" .
"<ebene1>" . "
{;}" .
"hallo Welt</ebene1>" .
"Hallo Welt 2" .
"</root>";
$aXMLDocument->loadXML( $sXML );
echo $aXMLDocument->documentElement->childNodes->length . "
";
Weiß jemand Abhilfe bzw. einen Workaround?
TIA und Gruß