Pregunta

Me pregunto si esto es posible.

Tengo html, así:

<p>
  <font face="Georgia">
    <b>History</b><br>&nbsp; <br>Two of the polysaccharides used in the manufacture of...</font>
    <a title="PubMed" href="http://www.www.gov/pubmed/" target="_blank">
    <font face="Georgia">) and this web site for new development by...well as Self Affirmed Medical Food GRAS status.&nbsp; 
    </font>
</p>

<p>
  <font face="Georgia">[READMORE]</font>
</p>

<p><font face="Georgia"><br><strong>Proprietary Composition</strong><br>
   <br>The method in which soluble fibres are made into... REST OF ARTICLE...
</p>

Sí, es feo html y que viene de un WYSIWYG, así que tengo poco control sobre ella.

Lo que quiero hacer es buscar [READMORE] en el documento, retire cualquier etiqueta de los padres (en este caso, la <font> y las etiquetas <p>) y reemplazarlos con un enlace readmore mientras envoltura el resto del documento en un gigante ... `resto del artículo ...

Estoy bastante seguro de que el HtmlAgilityPack me va a obtener una parte del camino, pero estoy tratando de averiguar por dónde empezar.

Hasta el momento, estoy bastante seguro de que tengo que usar htmlDoc.DocumentNode.SelectSingleNode(//p[text()="[READMORE]"]) o algo así. No estoy muy familiarizado con XPath.

Para mis documentos, el readmore puede o no puede estar en una etiqueta font anidada.

Además, en algunos casos, puede que no sea en una etiqueta en absoluto, sino más bien en la raíz del documento. Yo sólo puedo hacer una búsqueda normal y vuelva a colocar en ese caso y que debería ser sencillo.

Mi situación ideal sería algo como esto (pseudocódigo)

var node = SelectNodeContaining("[READMORE]").

node.Replace( "link here" );

node.RestOfDocument().Wrap("<div class='wrapper'");

Lo sé, lo estoy soñando ... pero espero que esto tenga sentido.

¿Fue útil?

Solución

Aquí es una solución XSLT :

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

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="p[descendant::text()[. = '[READMORE]']]">
  <a href="#ReadmoreWrapper">READMORE</a>
  <div class="wrapper" id="#ReadmoreWrapper">
   <xsl:apply-templates select="following-sibling::node()" mode="copy"/>
  </div>
 </xsl:template>

 <xsl:template match=
  "node()[ancestor::p[descendant::text()[. = '[READMORE]']]
         or
          preceding::p[descendant::text()[. = '[READMORE]']]
          ]
  "/>

  <xsl:template match="node()|@*" mode="copy">
      <xsl:copy>
       <xsl:apply-templates select="node()|@*" mode="copy"/>
      </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

cuando se aplica esta transformación en el siguiente documento XML

<html>
<p>
  <font face="Georgia">
    <b>History</b><br/>&#xA0; <br/>Two of the polysaccharides used in the manufacture of...</font>
    <a title="PubMed" href="http://www.www.gov/pubmed/" target="_blank"/>
    <font face="Georgia">) and this web site for new development by...well as Self Affirmed Medical Food GRAS status.&#xA0;
    </font>
</p>

<p>
  <font face="Georgia">[READMORE]</font>
</p>

<p><font face="Georgia"><br/><strong>Proprietary Composition</strong><br/>
   <br/>The method in which soluble fibres are made into... REST OF ARTICLE...
   </font>
</p>

</html>

el resultado deseado se produce

<html>
    <p>
        <font face="Georgia"><b>History</b><br/>  <br/>Two of the polysaccharides used in the manufacture of...</font>
        <a title="PubMed" href="http://www.www.gov/pubmed/" target="_blank"/>
        <font face="Georgia">) and this web site for new development by...well as Self Affirmed Medical Food GRAS status. 
    </font>
    </p>
    <a href="#ReadmoreWrapper">READMORE</a>
    <div class="wrapper" id="#ReadmoreWrapper">
        <p>
            <font face="Georgia"><br/><strong>Proprietary Composition</strong><br/><br/>The method in which soluble fibres are made into... REST OF ARTICLE...
   </font>
        </p>
    </div>
</html>

Otros consejos

Si estoy en lo cierto continuación, puede intentar una cosa ... como la misma cosa que hacemos en el envío de correos HTML personalizada

  1. Crear una plantilla de su página HTML con contenido estático.
  2. Anexar identificadores de contenidos dinámicos a medida que han declarado [ReadMore] o {} READMORE o algo similar a eso.
  3. Ahora lee la línea de archivo de plantilla HTML por línea y sustituir los identificadores con el texto deseado.
  4. Ahora guarda toda la cadena a un nuevo archivo html o hacer lo que quiera.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top