2012-03-01 13 views
11

संपादित करने के लिए HTML Agility Pack का उपयोग कैसे करूं तो मेरे पास एक HTML स्निपेट है जिसे मैं C# का उपयोग करके संशोधित करना चाहता हूं।मैं HTML स्निपेट

<div> 
This is a specialSearchWord that I want to link to 
<img src="anImage.jpg" /> 
<a href="foo.htm">A hyperlink</a> 
Some more text and that specialSearchWord again. 
</div> 

और मैं इसे इस को बदलना चाहते हैं:

<div> 
This is a <a class="special" href="http://mysite.com/search/specialSearchWord">specialSearchWord</a> that I want to link to 
<img src="anImage.jpg" /> 
<a href="foo.htm">A hyperlink</a> 
Some more text and that <a class="special" href="http://mysite.com/search/specialSearchWord">specialSearchWord</a> again. 
</div> 

मैं यहाँ कई सिफारिशों के आधार पर एचटीएमएल चपलता पैक का उपयोग करने के लिए जा रहा हूँ, लेकिन मैं नहीं जानता कि मैं कहाँ जा रहा हूँ । विशेष रूप से,

  1. मैं एक पूर्ण HTML दस्तावेज़ की बजाय स्ट्रिंग के रूप में आंशिक स्निपेट कैसे लोड करूं?
  2. संपादित कैसे करें?
  3. फिर मैं संपादित ऑब्जेक्ट की टेक्स्ट स्ट्रिंग कैसे लौटा सकता हूं?

उत्तर

17
  1. एक पूर्ण HTML दस्तावेज़ के रूप में ही। कोई फर्क नहीं पड़ता कि।
  2. 2 विकल्प हैं: आप सीधे InnerHtml संपत्ति को संपादित कर सकते हैं (या टेक्स्ट नोड्स पर Text) या उदाहरण के द्वारा डोम पेड़ को संशोधित कर सकते हैं। AppendChild, PrependChild आदि
  3. आप HtmlDocument.DocumentNode.OuterHtml संपत्ति का उपयोग कर सकते हैं या HtmlDocument.Save विधि का उपयोग कर सकते हैं (व्यक्तिगत रूप से मैं दूसरा विकल्प पसंद करता हूं)।

पार्स करने के लिए के रूप में, मैं पाठ नोड्स जो आपके div अंदर खोज पद शामिल चयन करें और फिर बस इसे बदलने के लिए string.Replace विधि का उपयोग करें:

var doc = new HtmlDocument(); 
doc.LoadHtml(html); 
var textNodes = doc.DocumentNode.SelectNodes("/div/text()[contains(.,'specialSearchWord')]"); 
if (textNodes != null) 
    foreach (HtmlTextNode node in textNodes) 
     node.Text = node.Text.Replace("specialSearchWord", "<a class='special' href='http://mysite.com/search/specialSearchWord'>specialSearchWord</a>"); 

और एक स्ट्रिंग के लिए परिणाम की बचत:

string result = null; 
using (StringWriter writer = new StringWriter()) 
{ 
    doc.Save(writer); 
    result = writer.ToString(); 
} 
+1

धन्यवाद। एकाधिक विकल्प एक चीज जिसे मैंने डीओएम मैनिपुलेशन के साथ खेलना सीख लिया है, निम्नलिखित कोड की उपयोगिता है: नोड.पेंटनोड। रीप्लेस चाइल्ड (न्यू नोड, नोड) – John

+0

एचटीएमएल डॉक्यूमेंट.डॉक्यूमेंट नोड.ऑउटरएचटीएमएल शून्य और डॉक्टर लौटाता है। सेव() StackOverflowException देता है मैं इसे कैसे हल कर सकता हूं –

+0

@NavinGupta शायद, आपके पास स्वयं-संदर्भ नोड्स हैं – Alex

1

उत्तर:

  1. ऐसा करने के लिए एक रास्ता हो सकता है, लेकिन मैं कैसे पता नहीं है। मैं पूरे दस्तावेज़ को लोड करने का सुझाव देता हूं।
  2. XPath और नियमित अभिव्यक्ति
  3. एक संयोजन उदाहरण के लिए नीचे दिए गए कोड को देखें। आपके पास अन्य बाधाओं का उल्लेख नहीं हो सकता है लेकिन यह कोड नमूना आपको प्रारंभ करना चाहिए।

ध्यान दें कि आपके एक्सपैथ अभिव्यक्ति को आपके इच्छित div को ढूंढने के लिए और अधिक जटिल होने की आवश्यकता हो सकती है।

HtmlDocument doc = new HtmlDocument(); 

doc.Load(yourHtmlFile); 
HtmlNode divNode = doc.DocumentNode.SelectSingleNode("//div[2]"); 
string newDiv = Regex.Replace(divNode.InnerHtml, @"specialSearchWord", 
"<a class='special' href='http://etc'>specialSearchWord</a>"); 
divNode.InnerHtml = newDiv; 
Console.WriteLine(doc.DocumentNode.OuterHtml); 
संबंधित मुद्दे