2009-06-11 7 views
2

Je travaille avec JDOM pour le moment. Je ne peux pas penser à une solution qui devrait essentiellement être un problème facile.Comment insérer XHTML dans XML

J'ai une chaîne valide XHTML:

<b>M&amp;A</b> &euro;

Comment puis-je insérer cela dans le DOM XML comme suit?

<parentNode>
    <b>M&amp;A</b>
    €
</parentNode>

(ce XML va alors hors d'un transformateur XSL, ce qui rend alors XHTML pour le navigateur)

Je suis venu avec les solutions «pseudo» suivantes, mais je ne suis pas sûr si elles sont possibles:

Désactivez les entités qui ne sont pas des entités XML, puis insérez-les.
Reinscape ne contient que des entites XML, puis HTML désapparaît la chaîne entière, puis insère.

Taras

Répondre

2

Je suppose que vous pouvez utiliser JTidy pour transformer des entités nommées en entités numérotées. Après cela, le XHTML est également valide en XML.

+0

C'est ce que j'ai fini par faire : * entrée Parse XHTML fragment comme HTML dans un DOM en utilisant JTidy * extrait tous les nœuds enfants du corps en utilisant XPath (/ html/corps/node()) * Insérez extrait des noeuds dans XML cible DOM La seule mise en garde était que ' est une entité XHTML valide, mais pas un HTML valide.Cela signifiait que la première étape ne traiterait pas la séquence: ' comme une apostrophe, mais plutôt comme 6 caractères individuels. J'ai corrigé ceci en remplaçant toutes les instances de ' par la référence numérique (bit d'un hack, mais cela fonctionne) – Taras

+0

Je suis sûr qu'il existe un moyen de dire à JTidy de remplacer toutes les références d'entités nommées par des références numérotées. Sur la ligne de commande, c'est "-n". Il y a aussi un switch pour le faire produire du XML valide. Je pense que la bibliothèque Java peut faire la même chose. – Tomalak

+0

Désolé, l'espacement est un peu en désordre. J'ai trouvé la propriété -n dans JTidy, cependant, je ne pouvais pas trouver une option pour analyser XHTML au lieu de HTML - il analyse l'entrée en HTML, ce qui signifie qu'il ne reconnaît pas l'entité '. J'ai regardé la source pour voir si je pouvais ajouter une entité, mais pas de chance. En fait, j'ai trouvé le code source responsable de la définition des entités (EntityTable), et j'ai découvert que ' n'était pas défini (les autres 252 entités HTML étaient – Taras

0

Alors que & euros; est une entité XHTML valide, elle n'est pas valide en XML.

Malheureusement, je ne sais rien à propos de JDOM, mais si c'est possible, vous pouvez essayer d'ajouter DTD entity declarations comme <!ENTITY euro "€">. Et, peut-être, mettre tous les balises XHTML dans leur espace de nom propre (<parentNode xmlns:x="http://www.w3.org/1999/xhtml"><x:b>...</x:b></parentNode>)

+0

Cette solution a été prise en compte, mais nous devrions le faire pour tous les sites HTML (XHTML?) Possibles - http://www.cookwood.com/html/extras/entities.html – Taras

0

Créer une chaîne contenant

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html> 

+

votre contenu XHTML, dans ce cas <b>M&amp;A</b> &euro;

+

</html> 

puis parser cette chaîne pour obtenir un document. Ensuite, récupérez tout le contenu de l'élément racine, ce sera votre contenu XHTML et placez-le dans votre élément parentNode. Vous devrez peut-être prendre en compte le fait que le contenu provient d'un document différent.

+1

J'ai essayé cette approche et j'ai rencontré le problème que lorsque vous essayez d'analyser la chaîne dans le document, car &eruo; n'est pas une entité XML, la chaîne contient essentiellement une esperluette non échappée, qui est un code XML non valide. – Taras

Questions connexes