2009-04-17 9 views
9

के साथ बंद नहीं हो रहा है HTMLAgilityPack का उपयोग एक नई छवि नोड लिखने के लिए, ऐसा लगता है कि किसी छवि का समापन टैग निकालना है, उदा। होना चाहिए, लेकिन जब आप बाहरी एचटीएमएल की जांच करते हैं, तो है।छवि टैग HTMLAgilityPack

string strIMG = "<img src='" + imgPath + "' height='" + pubImg.Height + "px' width='" + pubImg.Width + "px' />"; 

HtmlNode newNode = HtmlNode.Create(strIMG); 

यह एक्सएचटीएमएल टूट जाता है।

उत्तर

2

एक्सएमएल आउटपुट चालू करने का एक विकल्प है जो इस समस्या को दूर करता है।

var htmlDoc = new HtmlDocument(); 
htmlDoc.OptionOutputAsXml = true; 
htmlDoc.LoadHtml(rawHtml); 
+2

इस विधि के साथ एक समस्या यह है कि पहले एनकोडेड इकाइयां, जैसे गैर ब्रेकिंग स्पेस, एन्कोडेड हो जाती है, यह अवांछित व्यवहार हो सकता है – MJJames

19

उत्पादन एक्सएमएल को यह बोलने मिकी काम करता है पता चलता है के रूप में, लेकिन यदि आप अन्य कारणों से एक्सएमएल नहीं चाहता है, इस प्रयास करें:

doc.OptionWriteEmptyNodes = true; 
1

यह HtmlAgilityPack साथ एक बग हो रहा है।

Debug.WriteLine(HtmlNode.CreateNode("<img id=\"bla\"></img>").OuterHtml); 

आउटपुट विकृत HTML: वहाँ उदाहरण के लिए इस पुन: पेश करने, कई तरीके हैं। अन्य उत्तरों में सुझाए गए फिक्स का उपयोग कुछ भी नहीं करता है।

HtmlDocument doc = new HtmlDocument(); 
doc.OptionOutputAsXml = true; 
HtmlNode node = doc.CreateElement("x"); 
node.InnerHtml = "<img id=\"bla\"></img>"; 
doc.DocumentNode.AppendChild(node); 
Debug.WriteLine(doc.DocumentNode.OuterHtml); 

तरह <x><img id="bla"></x>

I have created a issue in CodePlex for this.

+1

तथ्य यह है कि यह समस्या अभी भी मौजूद है और ट्रैकर में 2007 के आरंभ से समस्याएं हैं और 2010 से काफी रकम मैं इसे जल्द ही तय करने पर सांस नहीं पकड़ूंगा। – Nenotlep

+0

मैं पार्सिंग के लिए एचएपी की सिफारिश करता हूं लेकिन मौजूदा एचटीएमएल को संशोधित करने के लिए नहीं। –

2

संपादित करें 1 विकृत एक्सएमएल/XHTML उत्पादन: यहां बताया गया एचटीएमएल Agilty पैक दस्तावेज़ सही ढंग से छवि (img) टैग दिखाने के लिए ठीक करने के लिए है:

if (HtmlNode.ElementsFlags.ContainsKey("img")) 
{ HtmlNode.ElementsFlags["img"] = HtmlElementFlag.Closed;} 
else 
{ HtmlNode.ElementsFlags.Add("img", HtmlElementFlag.Closed);} 

किसी अन्य टैग के लिए "img" को भी ठीक करने के लिए प्रतिस्थापित करें (इनपुट, चयन करें, और विकल्प अक्सर आते हैं)। आवश्यकतानुसार दोहराएं। ध्यान रखें कि यह "बंद" और "खाली" झंडे को एक साथ सेट होने से रोकने वाले एचएपी बग की वजह से उत्पादन करेगा। स्रोत: MikeBridge पर http://htmlagilitypack.codeplex.com/discussions/53782

मूल जवाब: सिर्फ इस मुद्दे के समाधान से अधिक परिश्रम करने के बाद, और किसी भी पर्याप्त जवाब (doctype ठीक से सेट, XML के रूप में आउटपुट का उपयोग कर, सिंटेक्स, AutoCloseOnEnd की जाँच करें, और खाली नोड विकल्प लिखें) नहीं मिल रहा , मैं इसे एक गंदे हैक के साथ हल करने में सक्षम था। यह निश्चित रूप से सभी के लिए इस मुद्दे को पूरी तरह से हल नहीं करेगा, लेकिन किसी भी व्यक्ति के लिए एक स्ट्रिंग (ईजी के माध्यम से ईजी) के रूप में जेनरेट किए गए एचटीएमएल/एक्सएमएल को लौटने के लिए, सरल समाधान नकली टैग का उपयोग करना है कि चपलता पैक को तोड़ने के बारे में पता नहीं है । एक बार जब आप अपने दस्तावेज़ पर जो कुछ भी करना चाहते हैं, उसे पूरा करने के बाद, प्रत्येक टैग के लिए आपको एक सिरदर्द देने के लिए निम्न विधि को कॉल करें (उल्लेखनीय उदाहरण विकल्प, इनपुट, और आईएमजी)। तत्काल बाद, अपनी अंतिम स्ट्रिंग प्रस्तुत करें और कुछ स्ट्रिंग के साथ प्रीफ़िक्स किए गए प्रत्येक टैग के लिए एक साधारण प्रतिस्थापन करें (इस मामले में "Fix_", और अपनी स्ट्रिंग वापस करें। यह केवल मामूली regex समाधान एक और सवाल मैं इस समय पता नहीं लगा सकते

private void fixHAPUnclosedTags(ref HtmlDocument doc, string tagName, bool hasInnerText = false) 
{ 
    HtmlNode tagReplacement = null; 
    foreach(var tag in doc.DocumentNode.SelectNodes("//"+tagName) 
    { 
     tagReplacement = HtmlTextNode.CreateNode("<fix_"+tagName+"></fix_"+tagName+">"); 
     foreach(var attr in tag.Attributes) 
     { 
      tagReplacement.SetAttributeValue(attr.Name, attr.Value); 
     } 
     if(hasInnerText)//for option tags and other non-empty nodes, the next (text) node will be its inner HTML 
     { 
      tagReplacement.InnerHtml = tag.InnerHtml + tag.NextSibling.InnerHtml; 
      tag.NextSibling.Remove(); 
     } 
     tag.ParentNode.ReplaceChild(tagReplacement, tag); 
    } 
} 

एक नोट के रूप में (की तर्ज पर कुछ), अगर मैं एक शर्त आदमी मुझे लगता है कि होगा थे में प्रस्तावित की तुलना में मेरी राय में बेहतर है कि माइकब्रिज का जवाब अनजाने में पैक में इस बग के स्रोत की पहचान करता है - कुछ बंद और खाली झंडे पारस्परिक रूप से अनन्य होने के कारण

इसके अतिरिक्त, थोड़ी अधिक खुदाई के बाद, मैं अकेला नहीं दिखता इस दृष्टिकोण को ले लिया है:

इसके अलावा, जिन मामलों में आपको केवल खाली तत्वों की आवश्यकता है, वही प्रश्न में सूचीबद्ध एक बहुत ही सरल फिक्स है, साथ ही साथ एचएपी कोडप्लेक्स चर्चा भी: http://htmlagilitypack.codeplex.com/discussions/14982?ProjectName=htmlagilitypack यह अनिवार्य रूप से माइकब्रिज के उत्तर में सूचीबद्ध खाली ध्वज विकल्प सेट करता है स्थायी रूप से हर जगह ऊपर।

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