استخدم HTMLAGILITYPACK لإعداد وثيقة
-
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 جديد أو افعل ما تريد.