[PHP] DOM XML tree invoegen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 19-09 08:48
Ik gebruik het volgende stukje code om een string om te zetten in een XML boom, en deze vervolgens in te voegen op het punt waar ik dat wil:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function append_html_child($xmlstr,$tagname,$element,$doc) {

    $xmlstr = "<".$tagname.">".$xmlstr."</".$tagname.">";

    if(!$dom = xmldoc($xmlstr)) {
      echo "Error while parsing the document\n";
      exit;
    }

    $root = domxml_root($dom); 

    $import_node = $doc->imported_node($root, true); 
    $element->append_child($import_node);
}


Nu werkt dat allemaal wel, op het feit na dat ik na het parsen van XML/XSL in de ingevoegde tag dit te zien krijg:
code:
1
xmlns=""

Wat daar dus duidelijk niet hoort te staan. Het rare is dat dit er niet staat wanneer ik mijn XSL niet laat processen. Dus wanneer ik pure XML als uitvoer opgeef, krijg ik netjes m'n tag zonder namespace attribuut. Ik snap er niks meer van!?!?

Ben er inmiddels wel achter dat het ligt aan het gebruik van "copy-of". Wanneer ik daar "value-of" neerzet werkt het wel. Maar ik heb eigenlijk wel copy-of nodig; iemand enig idee waarom copy-of ineens allemaal tags toevoegd?

[ Voor 17% gewijzigd door jsiegmund op 10-08-2004 18:05 ]


Acties:
  • 0 Henk 'm!

  • johnny7
  • Registratie: November 2000
  • Laatst online: 07-11-2023
Waarom gebruik je eigenlijk geen $doc->createElement?
Als je geen namespace specificeert bij het aanmaken van een nieuw element, zal de processor waarschijnlijk aannemen dat je de anonieme namespace gebruikt.
Heeft je root geen namespace?
Als je namelijk dezelfde namespace specificeert als je root, zul je zien dat er bij de kinderen geen xmlns="" komt te staan in de tag.

[ Voor 23% gewijzigd door johnny7 op 10-08-2004 18:12 ]


Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 20:38

alienfruit

the alien you never expected

Waarschijnlijk zit XSLT hier weer te bokken :) Normaal haal ik er gewoon nog een XSLT over heen die deze onzin weghaalt. Irritant gedoe. Maar je kan natuurlijk over die xmlns="bla" opgeven.

Acties:
  • 0 Henk 'm!

Verwijderd

iCe01 schreef op 10 augustus 2004 @ 17:59:

... iemand enig idee waarom copy-of ineens allemaal tags toevoegd?
Omdat je een kopie maakt van de DOM node, en die heeft dus een bepaalde namespace. Kennelijk is die anders dan de namespace van je uitvoer. Als deze namelijk hetzelfde was, dan hoeft die namespace declaratie daar niet te staan.

Probeer eens om betreffende node in het XML document in de juiste namespace te zetten.

[ Voor 11% gewijzigd door Verwijderd op 10-08-2004 19:46 ]


Acties:
  • 0 Henk 'm!

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 19-09 08:48
alienfruit schreef op 10 augustus 2004 @ 19:12:
Waarschijnlijk zit XSLT hier weer te bokken :) Normaal haal ik er gewoon nog een XSLT over heen die deze onzin weghaalt. Irritant gedoe. Maar je kan natuurlijk over die xmlns="bla" opgeven.
Ja dat dacht ik dus ook, totdat je dat probeert... dan voegtie nog een attribuut xmlns toe, met "bla" als waarde. Dat kun je dan weer gewoon deleten, maar die andere niet. Het mag toch sowieso niet voorkomen dat een tag er zo uitziet:
code:
1
<test xmlns="" xmlns="bla">content</test>


Heb het inmiddels opgelost door om die "copy-of" heen te werken, maar snappen doe ik het nog steeds niet helemaal.

@Cheeta: klinkt logisch, maar een XML document hoeft toch niet per se een namespace te bevatten? Dan moet het toch mogelijk zijn een string om te zetten naar een XML tree, het root element daarvan te includen in een andere boom, en dat pakketje weer als 1 boom behandelen? Dan zie ik niet in waarom er ineens een namespace in geplakt wordt zonder dat ik daarom vraag. Gelukkig is die DOM XML documentatie op php.net ook zo onwijs uitgebreid :+