2011-02-11 4 views
7

यह एक पुनरावर्ती प्रश्न प्रतीत होता है, लेकिन यहां जाता है।सभी शब्दों को संशोधित करने के लिए एचटीएमएल का विश्लेषण कैसे करें

मेरे पास HTML है जो अच्छी तरह से स्वरूपित है (यह एक नियंत्रित स्रोत से आता है, इसलिए इसे दिया जा सकता है)। मुझे HTML के शरीर की सामग्री के माध्यम से पुन: प्रयास करने की आवश्यकता है, दस्तावेज़ में सभी शब्दों की तलाश करें, उन शब्दों पर कुछ संपादन करें, और परिणामों को सहेजें।

उदाहरण के लिए, मेरे पास फ़ाइल sample.html है और मैं इसे अपने एप्लिकेशन और उत्पाद output.html के माध्यम से चलाने के लिए चाहता हूं, जो मूल के साथ ही मेरे संपादन के समान ही है।

मुझे HTMLAgilityPack का उपयोग करके निम्नलिखित पाया गया है, लेकिन मैंने पाया है कि सभी उदाहरण निर्दिष्ट टैग के गुणों को देखते हैं - क्या कोई आसान संशोधन है जो सामग्री को देखेगा और मेरे संपादन करेगा?

HtmlDocument HD = new HtmlDocument(); 
HD.Load (@"e:\test.htm"); 
var NoAltElements = HD.DocumentNode.SelectNodes("//img[not(@alt)]"); 
if (NoAltElements != null) 
{ 
    foreach (HtmlNode HN in NoAltElements) 
    { 
     HN.Attributes.Append("alt", "no alt image"); 
    } 
} 

HD.Save(@"e:\test.htm"); 

उपर्युक्त एएलटी टैग वाले छवि टैग के लिए उपरोक्त दिखता है। मैं फ़ाइल के <body> में सभी टैग देखना चाहता हूं और सामग्री के साथ कुछ करता हूं (जिसमें प्रक्रिया में नए टैग शामिल हो सकते हैं)।

<html> 
    <head><title>Some Title</title></head> 
    <body> 
     <h1>This is my page</h1> 
     <p>This is a paragraph of text.</p> 
    </body> 
</html> 

और उत्पादन है, जो यह अपरकेस बनाने और इसे तिर्छा बनाने के बीच हर शब्द और विकल्पों लेता उत्पादन:

<html> 
    <head><title>Some Title</title></head> 
    <body> 
     <h1>THIS <em>is</em> MY <em>page</em></h1> 
     <p>THIS <em>is</em> A <em>paragraph</em> OF <em>text</em>.</p> 
    </body> 
</html> 
मैं क्या कर सकता है की

एक बहुत ही सरल नमूना निम्न इनपुट ले

विचार, सुझाव?

उत्तर

5

व्यक्तिगत रूप से, इस सेटअप को देखते हुए, मैं शब्दों को खोजने के लिए एचटीएमएल नोड की इनरटेक्स्ट प्रॉपर्टी के साथ काम करता हूं (शायद रेगेक्स के साथ, इसलिए मैं विराम चिह्न के लिए बाहर निकल सकता हूं और रिक्त स्थान पर भरोसा नहीं कर सकता) और फिर इनरएचटीएमएल प्रॉपर्टी का उपयोग करने के लिए Regex.Replace को पुनरावर्तक कॉल का उपयोग करके परिवर्तन (क्योंकि Regex.Replace में एक विधि है जो आपको प्रारंभ करने की स्थिति और प्रतिस्थापित करने की संख्या दोनों निर्दिष्ट करने की अनुमति देती है)।

प्रसंस्करण कोड:

private string[] getWords(string text) 
{ 
    Regex reg = new Regex("/w+"); 
    MatchCollection matches = reg.Matches(text); 
    List<string> words = new List<string>(); 
    foreach (Match match in matches) 
    { 
     words.Add(match.Value); 
    } 
    return words.ToArray(); 
} 

प्रक्रिया एचटीएमएल:

private string processHtml(string html, string[] words) 
{ 
    int startPosition = 0; 
    foreach (string word in words) 
    { 
     startPosition = html.IndexOf(word, startPosition); 
     Regex reg = new Regex(word); 
     html = reg.Replace(html, alterWord(word), 1, startPosition); 
    } 

    return html; 
} 

IEnumerable<HtmlNode> nodes = doc.DocumentNode.DescendantNodes().Where(n => n.InnerText == "something"); 
foreach (HtmlNode node in nodes) 
{ 
    string[] words = getWords(node.InnerText); 

    node.InnerHtml = processHtml(node.InnerHtml, words); 
} 

शब्द की पहचान (वहाँ शायद यह करने के लिए कुछ बरसाती कोट तरीका है, लेकिन यहाँ एक प्रारंभिक वार है) मैं आपको AlterWord() के विवरण छोड़ दूंगा। :)

+0

धन्यवाद, मुझे लगता है कि यह वही है जो मैं ढूंढ रहा था! – Elie

3

.SelectNodes("//body//*") आज़माएं। इससे आपको किसी भी गहराई पर body तत्व के भीतर सभी तत्व मिलेंगे।

+0

लेकिन मैं उस टैग की सामग्री पर फिर से कैसे सक्रिय हो सकता हूं, प्रत्येक शब्द को पार्स करने में सक्षम होने के लिए जो टैग नहीं है? – Elie

+0

उस बिंदु पर, आपको तत्व की सामग्री को एक स्ट्रिंग के रूप में प्रोसेस करने पर निर्भर होना चाहिए, शायद नियमित अभिव्यक्तियों का उपयोग करना। – Flynn1179

संबंधित मुद्दे

 संबंधित मुद्दे