2012-03-01 27 views
11

Vì vậy, tôi có một đoạn mã HTML mà tôi muốn sửa đổi bằng C#.Tôi làm cách nào để sử dụng Gói nhanh nhẹn HTML để chỉnh sửa đoạn mã HTML

<div> 
This is a specialSearchWord that I want to link to 
<img src="anImage.jpg" /> 
<a href="foo.htm">A hyperlink</a> 
Some more text and that specialSearchWord again. 
</div> 

và tôi muốn biến nó như thế này:

<div> 
This is a <a class="special" href="http://mysite.com/search/specialSearchWord">specialSearchWord</a> that I want to link to 
<img src="anImage.jpg" /> 
<a href="foo.htm">A hyperlink</a> 
Some more text and that <a class="special" href="http://mysite.com/search/specialSearchWord">specialSearchWord</a> again. 
</div> 

Tôi sẽ sử dụng HTML Agility Pack dựa trên rất nhiều gợi ý ở đây, nhưng tôi không biết nơi tôi sẽ . Cụ thể,

  1. Làm cách nào để tải một đoạn mã một phần dưới dạng chuỗi, thay vì tài liệu HTML đầy đủ?
  2. Chỉnh sửa như thế nào?
  3. Làm cách nào để sau đó trả lại chuỗi văn bản của đối tượng đã chỉnh sửa?

Trả lời

17
  1. Giống như tài liệu HTML đầy đủ. Nó không quan trọng.
  2. Có 2 tùy chọn: bạn có thể chỉnh sửa trực tiếp InnerHtml thuộc tính (hoặc Text trên các nút văn bản) hoặc sửa đổi cây dom bằng cách sử dụng ví dụ: AppendChild, PrependChild vv
  3. Bạn có thể sử dụng HtmlDocument.DocumentNode.OuterHtml thuộc tính hoặc sử dụng phương pháp HtmlDocument.Save (cá nhân tôi thích tùy chọn thứ hai).

Như để phân tích, tôi chọn các nút văn bản có chứa các thuật ngữ tìm kiếm bên div của bạn, và sau đó chỉ cần sử dụng string.Replace phương pháp để thay thế nó:

var doc = new HtmlDocument(); 
doc.LoadHtml(html); 
var textNodes = doc.DocumentNode.SelectNodes("/div/text()[contains(.,'specialSearchWord')]"); 
if (textNodes != null) 
    foreach (HtmlTextNode node in textNodes) 
     node.Text = node.Text.Replace("specialSearchWord", "<a class='special' href='http://mysite.com/search/specialSearchWord'>specialSearchWord</a>"); 

Và tiết kiệm kết quả vào một chuỗi:

string result = null; 
using (StringWriter writer = new StringWriter()) 
{ 
    doc.Save(writer); 
    result = writer.ToString(); 
} 
+1

Cảm ơn. Nhiều tùy chọn. Một điều mà tôi đã học khi chơi với thao tác DOM là tính hữu ích của đoạn mã sau: node.ParentNode.ReplaceChild (newNode, node) – John

+0

HtmlDocument.DocumentNode.OuterHtml trả về null và doc.Save() cho StackOverflowException Làm thế nào tôi có thể giải quyết nó –

+0

@NavinGupta có thể, bạn có các nút tự tham chiếu – Alex

1

Đáp:

  1. Có thể có một cách để làm điều này nhưng tôi không biết làm thế nào. Tôi đề xuất tải toàn bộ tài liệu.
  2. Sử dụng kết hợp của XPath và biểu thức thông thường
  3. Xem mã bên dưới để có ví dụ giả tạo. Bạn có thể có các ràng buộc khác không được đề cập nhưng mẫu mã này sẽ giúp bạn bắt đầu .

Lưu ý rằng biểu thức Xpath của bạn có thể cần phức tạp hơn để tìm div bạn muốn.

HtmlDocument doc = new HtmlDocument(); 

doc.Load(yourHtmlFile); 
HtmlNode divNode = doc.DocumentNode.SelectSingleNode("//div[2]"); 
string newDiv = Regex.Replace(divNode.InnerHtml, @"specialSearchWord", 
"<a class='special' href='http://etc'>specialSearchWord</a>"); 
divNode.InnerHtml = newDiv; 
Console.WriteLine(doc.DocumentNode.OuterHtml); 
Các vấn đề liên quan