2009-04-17 21 views
9

Yeni bir görüntü düğümü yazmak için HTMLAgilityPack'in kullanılması, bir görüntünün kapanış etiketini, örn. Olmalı ama dış html kontrol ettiğinizde, var.Resim etiketi HTMLAgilityPack ile kapanmıyor

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

HtmlNode newNode = HtmlNode.Create(strIMG); 

Bu, xhtml'yi keser.

cevap

2

Bu sorunu gideren XML çıktısını açmak için bir seçenek var.

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

Bu yöntemle ilgili bir problem, daha önce kodlanmış varlıkların, frenleme alanı olmayan bir alan gibi kodlanmasının, bu istenmeyen davranış olabileceği yönündedir – MJJames

19

Micky çalışmalarını da anlaşılacağı gibi çıktı XML bunu söylemek, ancak XML istememek başka nedenler varsa, bu deneyin:

doc.OptionWriteEmptyNodes = true; 
1

Bu HTMLAgilityPack ile bir hata gibi görünüyor.

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

Çıkışlar hatalı biçimlendirilmiş HTML: örneğin, bu çoğaltmak için birçok yol vardır. Önerilen çözümlerin diğer cevaplarda kullanılması hiçbir şey yapmaz. İşte doğru görüntü (img) etiketlerini görüntülemek için bir HTML Agilty Paketi belgesini düzeltmek için yapılması gerekenler::

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

Bu sorunun hala var olması ve izleyicide 2007'den itibaren sorunların olması 2010'dan itibaren hatırı sayılır miktarda olan bir şey, bu konuda herhangi bir zamanda düzeltilemem. – Nenotlep

+0

Ayrıştırmak için HAP'ı öneririm, ancak varolan HTML'yi değiştirmek için değil. –

2

Edit 1 gibi bozuk XML/XHTML üretir

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

Onları düzeltmek için başka bir etiketin yerine "img" ifadesini değiştirin (giriş, seçim ve seçenek sıkça ortaya çıkıyor). Gerektiği kadar tekrarlayın. "Kapalı" ve "boş" bayrakların aynı anda ayarlanmasını engelleyen HAP hatası nedeniyle bunun üretileceğini unutmayın. Kaynak: MikeBridge http://htmlagilitypack.codeplex.com/discussions/53782

Orjinal cevap at: sadece bu konuya çözüm üzerinde zahmetli ve herhangi yeterli cevaplar (Doctype XML olarak Çıktı kullanarak, düzgün ayarlanmış, sözdizimi, AutoCloseOnEnd kontrol edin ve Boş Düğüm seçeneklerini yazın) görmediklerine olması Bunu kirli bir hack ile çözebildim. Bu, kesinlikle sorunu herkese açık olarak çözmeyecektir, ancak oluşturulan html/xml değerini bir dizge olarak döndüren (web hizmeti aracılığıyla EG) basit çözüm, çeviklik paketinin kırılmadığını bildiği sahte etiketler kullanmaktır. . Belgenizde yapmanız gereken her şeyi yapmayı bitirdikten sonra, her etiket için bir baş ağrısına neden olan bir kez aşağıdaki yöntemi çağırın (seçenek, girdi ve img olan dikkate değer örnekler). Hemen sonra, son dizginizi oluşturun ve bir dizeyle (bu durumda "Fix_") önceden eklenmiş her etiket için basit bir değişiklik yapın ve dizginizi döndürün. Bu sanırım edecek bir bahis adam olsaydı, şu anda bir not olarak

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); 
    } 
} 

(çizgisinde bir şey) bulamazsanız başka bir soru önerilen regex çözümü daha Bence sadece marjinal daha iyidir Yukarıdaki MikeBridge'ın cevabı istemeden paketin içindeki bu hatanın kaynağını tanımlar - kapalı ve boş bayrakların karşılıklı olarak özel olmasına neden olan

Ek olarak, biraz daha kazmaya başladım. Bu yaklaşımı almıştır:

Ayrıca, SADECE boş olmayan öğelere ihtiyaç duyduğunuz durumlarda, aynı soruda listelenen çok basit bir düzeltmenin yanı sıra, burada HAP kodekseks tartışması vardır: http://htmlagilitypack.codeplex.com/discussions/14982?ProjectName=htmlagilitypack Bu temelde MikeBridge'in yanıtında listelenen boş bayrak seçeneğini ayarlar. her yerde sürekli olarak.