Comment importer de la chaîne XML en php DOMDocument
Par exemple, j'ai créer un DOMDocument
comme ça :
<?php
$implementation = new DOMImplementation();
$dtd =
$implementation->createDocumentType
(
'html', //qualifiedName
'-//W3C//DTD XHTML 1.0 Transitional//EN', //publicId
'http://www.w3.org/TR/xhtml1/DTD/xhtml1-'
.'transitional.dtd' //systemId
);
$document = $implementation->createDocument('', '', $dtd);
$elementHtml = $document->createElement('html');
$elementHead = $document->createElement('head');
$elementBody = $document->createElement('body');
$elementTitle = $document->createElement('title');
$textTitre = $document->createTextNode('My bweb page');
$attrLang = $document->createAttribute('lang');
$attrLang->value = 'en';
$document->appendChild($elementHtml);
$elementHtml->appendChild($elementHead);
$elementHtml->appendChild($attrLang);
$elementHead->appendChild($elementTitle);
$elementTitle->appendChild($textTitre);
$elementHtml->appendChild($elementBody);
Donc, maintenant, si j'ai le xhtml chaîne comme ça :
<?php
$xhtml = '<h1>Hello</h1><p>World</p>';
Comment puis-je importer dans le <body>
nœud de mon DOMDocument
?
Pour l'instant, la seule solution que j'ai trouvé, c'est quelque chose comme ça :
<?php
$simpleXmlElement = new SimpleXMLElement($xhtml);
$domElement = dom_import_simplexml($simpleXmlElement);
$domElement = $document->importNode($domElement, true);
$elementBody->appendChild($domElement);
Cette solution semble très mauvais pour moi, et de créer des problemes, comme quand je l'ai essayer avec une chaîne comme ça :
<?php
$xhtml = '<p>Hello World</p>';
Ok, je peux contourner ce problème en convertissant xhtml entités en Unicode entités, mais c'est tellement laid...
Toute aide ?
Merci par avance !
Liés à la question :
DOMDocument::validate()
problème (résolu)
OriginalL'auteur Pascal Qyy | 2010-11-02
Vous devez vous connecter pour publier un commentaire.
Le problème est DOM ne sait pas qu'il doit tenir compte des DTD XHTML, sauf si vous avez validé le document contre elle. Sauf si vous le faites, DOM ne sait pas tout des entités définies dans la DTD, ni toutes les autres règles. Heureusement, nous avons trié sur la façon de procéder à la validation dans cette autre question, donc, armé de cette connaissance, vous pouvez faire
Puis les importer avec
sorties:
L'autre façon d'importer un fichier XML dans un autre DOM est d'utiliser
sorties:
Cependant, cela ne peut pas fonctionner avec
parce que lorsque vous chargez un document dans le DOM, DOM remplacera tout ce que vous avez dit avant sur le document. Ainsi, lors de l'utilisation de la charge, libxml (et donc SimpleXml, DOM et XMLReader) n'est (ne) sais pas vous dire XHTML. Et il ne connaît pas toutes les entités qui y sont définis et fuzz sur la place. Mais même si la chaîne ne contient pas l'entité, il n'est pas valide XML, car il lui manque un nœud racine. C'est pourquoi vous utilisez le fragment.
Qyy définir le flux HTTP contexte de l'utilisation d'un Proxy cache ensuite.
et @G. Qyy: une autre option pourrait être de annuler l'inscription HTTP gestionnaire de flux et le remplacer par votre propre application qui lit la DTD à partir d'une copie locale.
vous pouvez utiliser un idsystème qui pointe vers un fichier local au lieu de le W3C URL. Cela ne fonctionne que pour les documents que vous avez créés lors de la demande. À la différence de NG et la validation du Schéma, il n'y a pas de validateSource fonction qui vous permettra de passer une DTD dans une chaîne de caractères. Vous pourriez valider à l'encontre de la XHTML schéma mais les schémas de ne pas inclure des entités.
Ok, donc, après quelques recherches, il est impossible d'importer une chaîne de caractères XML sans valider le DOMDocument, ou les convertir en XHTML entités en Unicode. Je choisis donc la moins lourde solution: convertir les entités avec cette fonction pastebin.com/6ADYFLHa. Merci beaucoup pour votre aide
OriginalL'auteur Gordon
Vous pouvez utiliser un DomDocumentFragment pour cela:
C'est tout là est à lui...
Edit: Bien, si vous devez avoir xhtml (au lieu de xml valide), vous pourriez faire ce sale solution de contournement:
utilisation:
Qyy: Édité réponse avec une autre solution possible
XHTML avec un bien déclaré DTD XML valide, et votre solution de dérivation de l'DOMImplementation avec la déclaration de DTD, désolé... Merci beaucoup pour votre prêt à m'aider, et quoi d'autre ?
OriginalL'auteur ircmaxell