Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
[gelöst] DOMElement::childNodes, wieso DOMText? [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
ebiz-consult PHP Entwicklung
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
[gelöst] DOMElement::childNodes, wieso DOMText?


 
Seikilos
09-08-2009, 18:46 
 
Ich hab mir mal den Dreck angeguckt, der bei PHP als XML Bibliothek durchgeht und hab nun alle durch.

Was mich bei DOMDocument besonders interessiert ist neben der Tatsache, dass es das am wenigsten unhandliche System in PHP ist, warum laut der Dokue ein DOMElement::childNodes eine DOMNodeList zurück geben soll ich aber ne Liste voller DOMText Elemente bekomme?


$objDOM = new DOMDocument();
$objDOM->load($file); //make sure path is correct

$nodes = $objDOM->getElementsByTagName("element");
foreach($node->childNodes as $node)
{
var_dump(get_class($node)); // <---- DOMText
}

Doku zu childNodes:
PHP: DOMNode - Manual (http://de.php.net/manual/en/class.domnode.php#domnode.props.childnodes)
A DOMNodeList that contains all children of this node. If there are no children, this is an empty DOMNodeList.
Dafür, dass es ein Node ist, ist es ganz schön ein DOMText.
Und in meinem Code sind da Nodes drunter und kein Text.
Von der Hierarchie ist mir klar, das DOMText ein Node ist, aber ich will ein Node und kein Text, ich brauch die Hierarchie der einelnen Nodes, DOMText::wholeText liefert mir auch nichts

 
wahsaga
09-08-2009, 18:54 
 
Und in meinem Code sind da Nodes drunter und kein Text.
Wie sieht denn den XML aus?
Und was liefert die Kontrollausgabe in der foreach-Schleife alles?

 
Seikilos
09-08-2009, 18:56 
 
<?xml version="1.0" encoding="iso-8859-1"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1.0">

<xsd:element name="doc">
<xsd:annotation>
<xsd:appinfo>0</xsd:appinfo>
<xsd:documentation>Dokument Element</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="foo"/>
<xsd:element ref="bar" maxOccurs="unbounded"/>

</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>

 
wahsaga
09-08-2009, 19:21 
 
Also abgesehen davon, dass dein Beispielcode darauf gar nicht anwendbar ist (wirft natürlich Fehlermeldungen, wenn du auf die childNodes der DOMNodeList, die getElementsByTagName zurückliefert - es muss erst mal ein DOMElement ausgewählt werden), entspricht die Ausgabe der foreach-Schleife (nach entsprechender Korrektur) genau dem, was zu erwarten ist:
string(7) "DOMText"
string(10) "DOMElement"
string(7) "DOMText"
string(10) "DOMElement"
string(7) "DOMText"
Works as designed.

Hast du da ernsthaft etwas anderes erwartet?

 
Seikilos
09-08-2009, 19:25 
 
Was soll da denn ein DOMText sein?

 
wahsaga
09-08-2009, 19:34 
 
Die Zeilenumbrüche zwischen den Tags der Elemente stellen selbstverständlich auch Textknoten dar (auch wenn diese ausschliesslich Whitespace enthalten).

(Da frag' ich mich jetzt aber doch, wie man dazu kommt, die Klappe derart weit aufzureissen, dass man die XML-Implementierungen in PHP als "Dreck" bezeichnet - wenn offenbar so wenig Ahnung vorhanden ist, dass nicht mal derart grundlegende Dinge in Bezug auf XML bekannt sind ...)


Wenn du an diesen Whitespace-Textknoten nicht interessiert bist - dann setzt du halt die Eigenschaft preserveWhiteSpace des DOMDocuments auf false.

 
Seikilos
09-08-2009, 19:46 
 
Danke für die Info, das mit dem preserve scheint hilfreich.

Und mich nervt bei php die fehlende Abstraktionsschicht, ich will XML nicht per Hand anfassen müssen.
Darüber hinaus programmiere ich nicht seit gestern und neben AS 2 ist das XML Handling von PHP schlecht, habe damit kein gutes Handling. Das lösen andere Sprachen wesentlich besser, allein das fehlende ORM für XML (abgesehen evtl von SDO ist ein dicker Minuspunkt, weil er mich nun zwingt, ne verfluchte 2,5 K XSD Datei per Hand aufzuarbeiten, n relationales Schema zu bauen und nen parser für die XML selbst zu kreieren, alles Aufgaben, die sich perfekt bis zu nem Punkt automatisieren lassen können

 
Seikilos
10-08-2009, 21:10 
 
Kein Text

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 04:14 Uhr.