Question

Quelqu'un sait-il comment conserver le formatage du texte lors de l'utilisation de XPath pour extraire des données?

Je suis en train d'extraire tous les blocs

<div class="info"> <h5>title</h5> text <a href="somelink">anchor</a> </div>

à partir d'une page. Le problème est que lorsque j'accède à la nodeValue, je ne peux obtenir que du texte brut. Comment capturer le contenu, y compris le formatage, c’est-à-dire le h5 et une image fixe dans le code?

Merci d'avance. J'ai recherché toutes les combinaisons imaginables sur Google et aucune chance.

Était-ce utile?

La solution

Si vous l'avez en tant qu'élément DomElement $ dans le cadre d'un DomDocument $ dom, vous souhaiterez faire quelque chose comme:

$string = $dom->saveXml($element);

La valeur NodeValue d'un élément est vraiment la valeur textuelle, pas le code XML structuré.

Autres conseils

J'aimerais ajouter à la réponse de Ciaran McNulty

Vous pouvez faire la même chose dans SimpleXml comme:

$simplexml->node->asXml(); // saveXml() is now an alias

Et pour développer la citation

  

La valeur NodeValue d'un élément est vraiment la valeur textuelle, pas le code XML structuré.

Vous pouvez penser à votre nœud comme suit:

<div class="info">
    <__toString()> </__toString()>
    <h5>title</h5>
    <__toString()> text </__toString()>
    <a href="somelink">anchor</a>
    <__toString()> </__toString()>
</div>

Où appeler $element->nodeValue revient à appeler $element->__toString() qui obtiendrait uniquement les éléments __toString (). L’imaginaire __toString() que j’ai créé est officiellement défini comme un XML_TEXT_NODE

Le langage XPath est conçu pour être intégré dans une autre langue (telle que DOM API, XSLT, XQuery, ...) et ne peuvent pas être utilisées de manière autonome . La question initiale ne précise pas quelle est l'intégration souhaitée.

Vous trouverez ci-dessous une solution très simple et rapide lorsque XPath est intégré à XSLT . .

Cette transformation :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>

    <xsl:template match="div[@class='info']">
       <xsl:copy-of select="."/>
    </xsl:template>
</xsl:stylesheet>

lorsqu'il est appliqué à ce document XML :

<html>
    <body>
        <div class="info">
            <h1>title1</h1> text1
            <a href="somelink1">anchor1</a>
        </div>
        Something else here
        <div class="info">
            <h2>title2</h2> text2
            <a href="somelink2">anchor2</a>
        </div>
        Something else here
        <div class="info">
            <h3>title3</h3> text3
            <a href="somelink3">anchor3</a>
        </div>
    </body>
</html>

produit le résultat souhaité :

<div class="info">
  <h1>title1</h1> text1
    <a href="somelink1">anchor1</a>
</div>
        Something else here
<div class="info">
  <h2>title2</h2> text2
  <a href="somelink2">anchor2</a>
</div>
        Something else here
<div class="info">
  <h3>title3</h3> text3
  <a href="somelink3">anchor3</a>
</div>

Vous devez vous assurer que votre requête xpath se termine au <div class="info">. Cependant, en raison du fonctionnement de XPath, vous aurez toujours tous les "sous-tags" dans des nœuds séparés. Vous aurez juste besoin de les concaténer.

Vous pouvez également utiliser la fonctionnalité rejoindre de XPath, bien que je ne l'aie pas encore. utilisé, je ne peux pas dire quels problèmes vous pourriez rencontrer.

div/node() devrait faire l'affaire.

Exemple d'entrée:

<div class="info">
  some <h5>title</h5> text <a href="somelink">anchor</a> more text
</div>

Exemple de feuille de style XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
        <newtag>
                <xsl:copy-of select="div/node()"/>
        </newtag>
</xsl:template>

</xsl:stylesheet>

Exemple de sortie:

<?xml version="1.0" encoding="utf-8"?>
<newtag> some<h5>title</h5> text <a href="somelink">anchor</a> more text</newtag>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top