Используйте htmlagilitypack, чтобы Divy Up документа
-
29-09-2019 - |
Вопрос
Мне интересно, возможно ли это.
У меня есть 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>
<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, поэтому я мало контролирую его.
Я хочу найти ПРОЧИТАЙТЕ БОЛЬШЕ В документе удалите любые родительские теги (в данном случае <font>
и то <p>
Теги) и замените их ссылкой Readmore, когда обертывая оставшуюся часть документа в гигантскую `... остальная часть статьи ...
Я почти уверен, что htmlagilitypack принесет мне часть пути, но я просто пытаюсь выяснить, с чего начать.
Пока что я почти уверен, что мне нужно использовать htmlDoc.DocumentNode.SelectSingleNode(//p[text()="[READMORE]"])
или что-то. Я не слишком знаком с XPath.
Для моих документов, Readmore может или не может быть в вложенном font
ярлык.
Кроме того, в некоторых случаях это может быть вообще не в теге, а скорее в корне документа. Я могу просто выполнять обычный поиск и заменить в этом случае, и это должно быть просто.
Моя идеальная ситуация была бы чем -то вроде этого (псевдокод)
var node = SelectNodeContaining("[READMORE]").
node.Replace( "link here" );
node.RestOfDocument().Wrap("<div class='wrapper'");
Я знаю, я мечтаю ... но я надеюсь, что это имеет смысл.
Решение
Вот решение 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/>  <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>
<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>
Другие советы
Если я прав, вы можете попробовать одну вещь ... как то же самое, что мы делаем при отправке пользовательских HTML
- Создайте шаблон вашей HTML -страницы со статическим содержанием.
- Добавьте идентификаторы для динамического содержимого, как вы заявили [Readmore] или {readmore} или что -то похожее на это.
- Теперь прочитайте линию файла HTML шаблона по строке и замените идентификаторы желаемым текстом.
- Теперь сохраните всю строку в новый HTML -файл или делайте все, что хотите.