Einzelnen Beitrag anzeigen

Neuromancer

Registriert seit: 8. Aug 2003
62 Beiträge
 
Delphi 7 Enterprise
 
#1

Bug? oder wieder mal vergessen, einen Schalter umzulegen?

  Alt 18. Nov 2007, 07:44
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>" . "&#10{;}" .
          "<ebene1>" . "&#10{;}" .
          "hallo Welt</ebene1>" .
          "Hallo Welt 2" .
          "</root>";
         
  $aXMLDocument->loadXML( $sXML );

  echo $aXMLDocument->documentElement->childNodes->length . "
";
Weiß jemand Abhilfe bzw. einen Workaround?

TIA und Gruß
  Mit Zitat antworten Zitat