Используйте HtmlAgilityPack, чтобы разделить документ - PullRequest
0 голосов
/ 19 августа 2010

Мне интересно, возможно ли это?

У меня есть html примерно так:

<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>

Да, это уродливый html, и он исходит от WYSIWYG, поэтому я мало контролируюЭто.

Я хочу найти в документе [READMORE] , удалить любые родительские теги (в данном случае теги <font> и <p>) и заменить ихсо ссылкой readmore во время упаковки REST документа в гигантскую `... остальную часть статьи ...

Я почти уверен, что HtmlAgilityPack поможет мне в этом, но япросто пытаюсь понять, с чего начать.

Пока я почти уверен, что должен использовать htmlDoc.DocumentNode.SelectSingleNode(//p[text()="[READMORE]"]) или что-то в этом роде.Я не слишком знаком с XPATH.

Для моих документов считыватель может находиться или не находиться во вложенном теге font.

Кроме того, в некоторых случаях он может вообще не быть в теге, а скорее вкорень документа.Я могу просто выполнить обычный поиск и замену в этом случае, и это должно быть просто.

Моя идеальная ситуация была бы примерно такой (PSEUDOCODE)

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

node.Replace( "link here" );

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

Я знаю, ямечтать ... но я надеюсь, что это имеет смысл.

Ответы [ 2 ]

3 голосов
/ 19 августа 2010

Вот решение 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>

когда это преобразование применяется к следующему документу 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>

желаемый результат получен :

<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>
0 голосов
/ 19 августа 2010

Если я прав, Вы можете попробовать одну вещь ... как то же самое, что мы делаем при отправке пользовательских html-писем

  1. Создать шаблон вашей html-страницы со статическим содержимым.
  2. Добавьте идентификаторы для динамического содержимого, как вы указали [ReadMore] или {ReadmOre} или что-то похожее на это.
  3. Теперь прочитайте файл шаблона html построчно и замените идентификаторы требуемым текстом.
  4. Теперь сохраните всю строку в новый HTML-файл или сделайте все, что вы хотите.
...