Получить весь элемент формы как строку, используя Html Agility Pack

c# html-agility-pack

Вопрос

Это первый раз, когда я использую Html Agility Pack и сразу сталкиваюсь с проблемами.

Так же, как мой заголовок предполагает, что я хочу получить весь элемент как строку, включая внутренние элементы.

Так, например, ниже мой html, и я ищу элемент формы с id aspnetForm

<html>  
<head>  
</head>  
<body>  
  <form name="aspnetForm" id="aspnetForm">
    <div id="div1">  
        <a href="div1-a1">Link 1 inside div1</a>  
        <a href="div1-a2">Link 2 inside div1</a>  
    </div>  
    <a href="a3">Link 3 outside all divs</a>      
    <div id="div2">  
        <a href="div2-a1">Link 1 inside div2</a>  
        <a href="div2-a2">Link 2 inside div2</a>  
    </div> 
  </form> 
</body>  
</html>

Я хочу, чтобы следующий результат (в строке)

  <form name="aspnetForm" id="aspnetForm">
    <div id="div1">  
        <a href="div1-a1">Link 1 inside div1</a>  
        <a href="div1-a2">Link 2 inside div1</a>  
    </div>  
    <a href="a3">Link 3 outside all divs</a>      
    <div id="div2">  
        <a href="div2-a1">Link 1 inside div2</a>  
        <a href="div2-a2">Link 2 inside div2</a>  
    </div> 
  </form> 

Я обычно не люблю спрашивать такие вопросы, связанные с ложкой, но я пытался и искал, но не мог получить ответ.

Пожалуйста помоги!

Заранее спасибо!

Принятый ответ

Кажется, вы ищете HtmlNode.OuterHtml :

//
// Summary:
//     Gets or Sets the object and its content in HTML.
public virtual string OuterHtml { get; }

Поэтому вам просто нужно выбрать свой узел формы и получить его свойство OuterHtml:

HtmlDocument doc = ... // load your HTML
HtmlNode formNode = doc.DocumentNode.SelectSingleNode("//form[@id='aspnetForm']");
string entireElementAsString = formNode.OuterHtml;

ОБНОВИТЬ

Кажется, что есть очень старая ошибка с тем, как HAP обрабатывает теги form . Или, может быть , это особенность !

В любом случае, обходной путь:

HtmlNode.ElementsFlags.Remove("form");

Поэтому это должно работать:

HtmlNode.ElementsFlags.Remove("form");
HtmlDocument doc = ... // load your HTML
HtmlNode formNode = doc.DocumentNode.SelectSingleNode("//form[@id='aspnetForm']");
string entireElementAsString = formNode.OuterHtml;

Популярные ответы

Действительно хороший вопрос, довольно странный, все перечисленные ниже!

Использование HtmlAgilityPack - пока не придумать решение!

(обратите внимание, что я также использую библиотеку ScugSharp nuget, чтобы получить расширение селекторов Css (ScrapySharp.Extensions)

 string html = @"<html>
        <head>
        </head>
        <body>
          <form name='aspnetForm' id='aspnetForm'>
            <div id='div1'>
                <a href='div1-a1'>Link 1 inside div1</a>
                <a href='div1-a2'>Link 2 inside div1</a>
            </div>
            <a href='a3'>Link 3 outside all divs</a>
            <div id='div2'>
                <a href='div2-a1'>Link 1 inside div2</a>
                <a href='div2-a2'>Link 2 inside div2</a>
            </div>
          </form>
        </body>
        </html>";

    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(html);

    string result = string.Empty;

    var formElement = doc.DocumentNode.CssSelect("form").FirstOrDefault();
    var formChildren = formElement.Descendants();

    StringBuilder sb = new StringBuilder();

    if (formChildren != null)
    {
        foreach (var child in formChildren)
        {
            sb.AppendLine(child.InnerHtml);
        }
    }

        //formElement.InnerHtml also returns empty !
        Console.WriteLine(sb.ToString());

Тем не менее, вы можете достичь этого - проще - с помощью AngleSharp (в настоящее время угол обзора кажется рекомендуемым, поскольку он все еще поддерживается / развивается, а HtmlAgility Pack - нет).

Использование AngleSharp - работает

 HtmlParser parser = new HtmlParser();
 var parsedDoc = parser.Parse(html);
 Console.WriteLine(parsedDoc.QuerySelector("form").InnerHtml);

Выход (с использованием AngleSharp):

введите описание изображения здесь



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему