Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Bug? oder wieder mal vergessen, einen Schalter umzulegen? (https://www.delphipraxis.net/103589-bug-oder-wieder-mal-vergessen-einen-schalter-umzulegen.html)

Neuromancer 18. Nov 2007 06:44


Bug? oder wieder mal vergessen, einen Schalter umzulegen?
 
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
Delphi-Quellcode:
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ß

Neuromancer 18. Nov 2007 08:15

Re: Bug? oder wieder mal vergessen, einen Schalter umzulegen
 
Habe eben mal schnell in ein paar anderen Programmiersprachen getestet:

Bei VB.NET genau das selbe Problem:
Code:
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    _aXMLDoc.LoadXml("<?xml version='1.0' encoding='iso-8859-1'?>" + _
                     "<root>" + Chr(10) + " " + _
                     "<ebene1>" + Chr(10) + _
                     "hallo Welt</ebene1>" + _
                     "Hallo Welt 2" + _
                     "</root>")

    MsgBox(_aXMLDoc.DocumentElement.ChildNodes.Count)

  End Sub
Anzahl der Elemente: 2.
Liegt wohl daran, dass .NET auf dem selben Parser wie die MS XML Core Services aufsetzt.

Java wiederum scheint es richtig zu machen:
Code:
  public static void main( String[] args ) throws SAXException, IOException, ParserConfigurationException
  {
    Document aDocument = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse( "test.xml" );

    System.out.println( aDocument.getDocumentElement().getChildNodes().getLength() );
  }
wobei test.xml:
XML-Code:
<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<root>
  <ebene1>
    hallo Welt
  </ebene1>
  Hallo Welt 2
</root>
Anzahl der Elemente: 3.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:22 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