![]() |
Bug? oder wieder mal vergessen, einen Schalter umzulegen?
Hallo,
ich versuche mittels IXMLDOMDocument2 ein XML-Document zu parsen. Code:
Delphi-Quellcode:
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.
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; Die Ausgabe
Delphi-Quellcode:
ergibt dann fälschlicherweise 2, obwohl eigentlich 3 Nodes zurückgegeben werden müssten.
ShowMessage('childNodes->length: ' + IntToStr( aXMLDE.childNodes.length ));
Folglich arbeitet die rekursive Funktion EraseAllWhitespaces
Delphi-Quellcode:
nicht richtig, weil der besagte Node nicht als TextNode erkannt wird.
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; 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:
Weiß jemand Abhilfe bzw. einen Workaround?
$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 . " "; TIA und Gruß |
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:
Anzahl der Elemente: 2.
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 Liegt wohl daran, dass .NET auf dem selben Parser wie die MS XML Core Services aufsetzt. Java wiederum scheint es richtig zu machen:
Code:
wobei test.xml:
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() ); }
XML-Code:
Anzahl der Elemente: 3.
<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<root> <ebene1> hallo Welt </ebene1> Hallo Welt 2 </root> |
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