2011-03-24 16 views
8

में 'से कम' साइन को खोना मैंने हाल ही में HtmlAgilityPack के साथ प्रयोग करना शुरू कर दिया है। मैं अपने सभी विकल्पों से परिचित नहीं हूं और मुझे लगता है कि मैं कुछ गलत कर रहा हूं।HtmlAgilityPack loadhtml

मैं निम्नलिखित सामग्री के साथ एक स्ट्रिंग है:

string s = "<span style=\"color: #0000FF;\"><</span>"; 

आप देखते हैं कि मेरी सी अवधि में मैं एक 'कम से कम' पर हस्ताक्षर किया है। मैं निम्नलिखित कोड के साथ इस स्ट्रिंग की प्रक्रिया:

HtmlDocument htmlDocument = new HtmlDocument(); 
htmlDocument.LoadHtml(s); 

लेकिन जब मैं इस तरह के अंतराल में एक त्वरित और गंदा नज़र करते हैं: मुझे लगता है कि अवधि में खाली है

htmlDocument.DocumentNode.ChildNodes[0].InnerHtml 

'कम से कम' चिह्न को बनाए रखने के लिए मुझे किस विकल्प की आवश्यकता है। मैंने पहले ही यह कोशिश की है:

htmlDocument.OptionAutoCloseOnEnd = false; 
htmlDocument.OptionCheckSyntax = false; 
htmlDocument.OptionFixNestedTags = false; 

लेकिन बिना किसी सफलता के।

मुझे पता है कि यह अवैध HTML है। मैं अमान्य HTML को ठीक करने के लिए इसका उपयोग कर रहा हूं और 'कम से कम' संकेतों पर HTMLEncode का उपयोग कर रहा हूं

कृपया मुझे सही दिशा में निर्देशित करें। अग्रिम

+2

अमान्य HTML है यही कारण है, इसलिए सभी दांव बंद कर रहे हैं - आप इससे कम चिह्न 'के रूप में <' –

+1

एन्कोडिंग किया जाना चाहिए मैं जानता हूँ कि यह अमान्य HTML है। मैं अमान्य एचटीएमएल को ठीक करने के लिए इसका उपयोग कर रहा हूं और 'कम से कम' संकेतों पर HTMLEncode का उपयोग कर रहा हूं – TurBas

+0

मैंने सोचा होगा कि कंप्यूटर के लिए काम करना मुश्किल होगा कि क्या दिया गया कोणीय ब्रैकेट एक टूटी हुई HTML टैग का हिस्सा है या एक गलत से बच निकला कोणीय ब्रैकेट। क्या एचटीएमएल के कुछ हिस्सों में इसका कोई अन्य टैग है? मैं आश्चर्यचकित हूं कि अगर इसे किसी अन्य चीज़ में परिवर्तित करने के बजाय इसे पूरी तरह नष्ट कर दिया गया है, लेकिन मैं गलत हो सकता हूं ... – Chris

उत्तर

4

एचटीएमएल चपलता पैक एक त्रुटि के रूप में इस का पता लगाता है और एक HtmlParseError उदाहरण बनाता है इसके लिए। आप HtmlDocument क्लास के ParseErrors का उपयोग करके सभी त्रुटियों को पढ़ सकते हैं। तो, आप इस कोड को चलाते हैं:

string s = "<span style=\"color: #0000FF;\"><</span>"; 
    HtmlDocument doc = new HtmlDocument(); 
    doc.LoadHtml(s); 
    doc.Save(Console.Out); 

    Console.WriteLine(); 
    Console.WriteLine(); 

    foreach (HtmlParseError err in doc.ParseErrors) 
    { 
     Console.WriteLine("Error"); 
     Console.WriteLine(" code=" + err.Code); 
     Console.WriteLine(" reason=" + err.Reason); 
     Console.WriteLine(" text=" + err.SourceText); 
     Console.WriteLine(" line=" + err.Line); 
     Console.WriteLine(" pos=" + err.StreamPosition); 
     Console.WriteLine(" col=" + err.LinePosition); 
    } 

यह इस प्रदर्शित करेगा (पहले ठीक किया पाठ, और विवरण त्रुटि के बारे में तो):

<span style="color: #0000FF;"></span> 

Error 
code=EndTagNotRequired 
reason=End tag </> is not required 
text=< 
line=1 
pos=30 
col=31 

तो तुम इस त्रुटि को ठीक करने के लिए कोशिश कर सकते हैं, के रूप में आपके पास सभी आवश्यक जानकारी (लाइन, कॉलम और स्ट्रीम स्थिति सहित) है लेकिन एचटीएमएल में फिक्सिंग (पता लगाने) त्रुटियों की सामान्य प्रक्रिया बहुत जटिल है।

2

धन्यवाद, मार्कअप ठीक है क्योंकि अपने HTML स्ट्रिंग अमान्य है:

string s = "<span style=\"color: #0000FF;\">&lt;</span>"; 
+0

मुझे पता है कि यह अवैध HTML है। मैं अमान्य HTML को ठीक करने और संकेत 'से कम' – TurBas

+0

@TurBas पर HTMLEncode उपयोग करने के लिए इस का उपयोग कर रहा है: यदि पाठ 'एक

+0

यह एक <> ... है तो वह इसे एक शुरुआती टैग के रूप में देखता है और इसे बंद कर देता है? बी को हटा रहा है? – TurBas

0

स्ट्रिंग "एस" बुरा एचटीएमएल है।

string s = "<span style=\"color: #0000FF;\">&lt;</span>"; 

यह सच है।

2

हालांकि यह सच है कि दिया गया HTML अमान्य है, HtmlAgilityPack अभी भी इसे पार्स करने में सक्षम होना चाहिए। "<" एन्कोड करना भूलने के लिए वेब पर यह एक असामान्य गलती नहीं है, और यदि HtmlAgilityPack को क्रॉलर के रूप में उपयोग किया जाता है, तो उसे खराब HTML की उम्मीद करनी चाहिए। मैंने आईई, क्रोम और फ़ायरफ़ॉक्स में उदाहरण का परीक्षण किया, और वे सभी अतिरिक्त < टेक्स्ट के रूप में दिखाते हैं।

मैंने लिखा निम्न विधि है कि आप preprocess करने के लिए एचटीएमएल स्ट्रिंग का उपयोग करें और "&lt;" के साथ सभी 'खुली हुई' '<' पात्रों की जगह ले सकता:

static string PreProcess(string htmlInput) 
{ 
    // Stores the index of the last unclosed '<' character, or -1 if the last '<' character is closed. 
    int lastGt = -1; 

    // This list will be populated with all the unclosed '<' characters. 
    List<int> gtPositions = new List<int>(); 

    // Collect the unclosed '<' characters. 
    for (int i = 0; i < htmlInput.Length; i++) 
    { 
     if (htmlInput[i] == '<') 
     { 
      if (lastGt != -1) 
       gtPositions.Add(lastGt); 

      lastGt = i; 
     } 
     else if (htmlInput[i] == '>') 
      lastGt = -1; 
    } 

    if (lastGt != -1) 
     gtPositions.Add(lastGt); 

    // If no unclosed '<' characters are found, then just return the input string. 
    if (gtPositions.Count == 0) 
     return htmlInput; 

    // Build the output string, replace all unclosed '<' character by "&lt;". 
    StringBuilder htmlOutput = new StringBuilder(htmlInput.Length + 3 * gtPositions.Count); 
    int start = 0; 

    foreach (int gtPosition in gtPositions) 
    { 
     htmlOutput.Append(htmlInput.Substring(start, gtPosition - start)); 
     htmlOutput.Append("&lt;"); 
     start = gtPosition + 1; 
    } 

    htmlOutput.Append(htmlInput.Substring(start)); 
    return htmlOutput.ToString(); 
} 
3

जैसा कि एक और उत्तर में बताया गया है, मैंने पाया कि सबसे अच्छा समाधान एचटीएमएल को < प्रतीकों को उनके HTML एन्कोडेड मान &lt; में परिवर्तित करने के लिए पूर्व-विश्लेषण करना था।

return Regex.Replace(html, "<(?![^<]+>)", "&lt;"); 
संबंधित मुद्दे