[PHP::DOM XML] XML in een bestaande XML boom importeren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Freak_NL
  • Registratie: Juli 2000
  • Laatst online: 22-08 14:17
Ik ben aan het experimenteren met de DOM XML functies in PHP en loop nu tegen een probleempje aan.

Situatie:

Ik heb een XML boom in de vorm van de DOM XML objecten. Zo bijvoorbeeld:
PHP:
1
2
3
4
$doc = domxml_new_doc ("1.0");
$html = $doc->append_child ($doc->create_element ("html"));
$head = $html->append_child ($doc->create_element ("head"));
$body = $html->append_child ($doc->create_element ("body"));


Nu heb ik een stringetje XML. Het is heel goed mogelijk om die naar de DOM XML objecten om te zetten:
PHP:
1
2
$html = "<xhtml><b>test</b><hr /><i>Nog meer XHTML</i></xhtml>";
$dom = domxml_open_mem ($html);

Maar nu wil ik alle elementen uit element <xhtml> van die nieuwe XML boom ($dom) in bijvoorbeeld het <body> element van de eerste zetten, alleen kan ik hier geen functie voor vinden. (ook Google laat me hier in de steek)

Ik heb wel geprobeerd om de elementen gewoon met een iteratie eruit te halen, maar daar wordt PHP een beetje boos om:
quote: php
Warning: append_child(): Can't append node, which is in a different document than the parent node
Heeft iemand hier ervaring mee?

Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
array DomNode->child_nodes ( void )

mssn kun je daar wat mee :?

edit: :?
PHP:
1
2
3
4
$xhtmlNode = $dom->getelements_by_by_tagname('xhtml');

if ($xhtmlNode[0]) $childNodes = $xhtmlNode[0]->child_nodes(void);
else die('Geen xHTML element gevonden');

[ Voor 59% gewijzigd door r0bert op 07-07-2003 20:46 ]


Acties:
  • 0 Henk 'm!

  • Freak_NL
  • Registratie: Juli 2000
  • Laatst online: 22-08 14:17
Ho, excuses, ik heb child_nodes juist al geprobeerd, maar daarna geeft PHP die melding.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
$doc = domxml_new_doc ("1.0");
$html = $doc->append_child ($doc->create_element ("html"));
$head = $html->append_child ($doc->create_element ("head"));
$body = $html->append_child ($doc->create_element ("body"));

$html = "<xhtml><b>test</b><hr /><i>Nog meer XHTML</i></xhtml>";
$dom = domxml_open_mem ($html);
$tmp = $dom->child_nodes ();

foreach ($tmp as $element)
{
    $body->append_child ($element);
}

Daar komt mijn code nu ongeveer op neer. (zonder de classes, functions en logische structuur)

Of moet de append_child in de loop anders?

Acties:
  • 0 Henk 'm!

  • Rense Klinkenberg
  • Registratie: November 2000
  • Laatst online: 03-09 14:12
In de DOM Level 2 specificatie staat wel de methode importNode bij de document interface.

In de manual van van php/domxml staat de functie DomDocument_imported_node echter als deprecated functie zonder dat er enige nieuwe optie voor wordt aangegeven.

Dat betekend dus dat je naar alle waarschijnlijkheid het document zelf door moet lopen op zoek naar nodes en die handmatig in het andere document invoegen.

Misschien dat de verbeterde domxml extensie van php5 wel de importNode functie heeft.

Acties:
  • 0 Henk 'm!

  • Freak_NL
  • Registratie: Juli 2000
  • Laatst online: 22-08 14:17
Hmm.. daar was ik al bang voor.. Ah well. :)

Acties:
  • 0 Henk 'm!

  • Rense Klinkenberg
  • Registratie: November 2000
  • Laatst online: 03-09 14:12
Stiekem toch even aan de slag gegaan met die functie die liever niet gebruikt mag worden en het lijkt wel te werken.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Build document 1
$doc1 = domxml_new_doc('1.0');
$doc1->append_child($doc1Root = $doc1->create_element('root'));

// Build document 2
$doc2 = domxml_new_doc('1.0');
$doc2->append_child($doc2Root = $doc2->create_element('root'));
$doc2Root->append_child($doc2Node = $doc2->create_element('test_node'));
$doc2Node->append_child($doc2SubNode = $doc2->create_element('test_sub_element'));
$doc2SubNode->set_attribute('foo', 'bar');

// Display current status
echo '<h1>Before importing</h1>';
echo '<pre><b>doc1</b><br>' , htmlspecialchars($doc1->dump_mem(true)) , '</pre>
<pre><b>doc2</b><br>' , htmlspecialchars($doc2->dump_mem(true)) , '</pre>';

// Import doc2Node to doc1
$doc1Node = $doc1->imported_node($doc2Node, true);
$doc1Root->append_child($doc1Node);

// Display current status
echo '<h1>After importing</h1>';
echo '<pre><b>doc1</b><br>' , htmlspecialchars($doc1->dump_mem(true)) , '</pre>
<pre><b>doc2</b><br>' , htmlspecialchars($doc2->dump_mem(true)) , '</pre>';
Geeft keurig als resultaat:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Before importing
doc1
<?xml version="1.0"?>
<root/>

doc2
<?xml version="1.0"?>
<root>
  <test_node>
    <test_sub_element foo="bar"/>
  </test_node>
</root>

After importing
doc1
<?xml version="1.0"?>
<root>
  <test_node>
    <test_sub_element foo="bar"/>
  </test_node>
</root>

doc2
<?xml version="1.0"?>
<root>
  <test_node>
    <test_sub_element foo="bar"/>
  </test_node>
</root>
edit:
In de php5 API is wel weer de methode document::importNode() opgenomen en die werkt ook op exact dezelfde manier.

[ Voor 26% gewijzigd door Rense Klinkenberg op 07-07-2003 22:28 ]


Acties:
  • 0 Henk 'm!

  • Freak_NL
  • Registratie: Juli 2000
  • Laatst online: 22-08 14:17
Lastig.. Het kan dus wel, maar nu is er het risico dat de functie er bij een nieuwe versie van PHP uit ligt. Ik vraag me af wat dan het alternatief moet zijn als deze functie deprecated is.. :? (bedankt in ieder geval)

edit:
Ah kijk, dat schept hoop, in PHP 5 wel weer. :)

[ Voor 13% gewijzigd door Freak_NL op 07-07-2003 22:35 ]

Pagina: 1