संपादित करें 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 यह अनिवार्य रूप से माइकब्रिज के उत्तर में सूचीबद्ध खाली ध्वज विकल्प सेट करता है स्थायी रूप से हर जगह ऊपर।
इस विधि के साथ एक समस्या यह है कि पहले एनकोडेड इकाइयां, जैसे गैर ब्रेकिंग स्पेस, एन्कोडेड हो जाती है, यह अवांछित व्यवहार हो सकता है – MJJames