none
C# WebBrowser Как сохранить загруженный документ? RRS feed

  • Вопрос

  • После WebBrowser.Navigate в зависимости от загруженного контента в DocumentStream (DocumentText) зачастую уже находится измененный вариант страницы в частности это качается згрузки XML. Но как мне получить исходную загруженную страницу я так и не нашел. Сам WebBrowser предлагет только вызвать диалог SaveAs и ни о какой автоматизации тогда не может быть и речи.

    Нашел старые ссылки на использование IPersistFile, но как привести к этому интерфейсу WebBrowser я так и не понял.

    Может чем-нибудь подсобите? Для примера подойдет любой загруженный в WebBrowser XML документ.

    P.S. Вариант решения с WebClient и аналогами не предлагать!

    28 февраля 2012 г. 12:55

Все ответы

  • Здравствуйте.

    Попробуйте посмотреть пример A Web Browser in C# там показывается как вызвать Save click.

    Так же в другом примере HOW TO: Invoke the Find, View Source, and Options Dialog Boxes for the WebBrowser Control from Visual C# .NET рассказывается как вызвыть View Source и возможно объединив это с Save вы получите то, что хотите.

    PS. Почему вы так категоричны в отношении WebClient?


    Для связи [mail]

    29 февраля 2012 г. 6:41
  • Да как-то на диалогах кликать не по религии, там тогда еще возникает проблема с указанием пути сохранения. А по поводу IPersistFile нет никаких наработок, вроде как раньше этот интерфейс поддерживался.

    Отношени к WebClient не категорично более того в данный момент на нем и реализовано. Просто WebBrowser используется  по причине JavaScript, cookies и далеко не все можно перенести в WebClient. И реализация на нем получается частным случаем с заполнение кукиес и переадресаций, а мне необходим универсальный вариант. Раз уже страница отобразилась, то не хочется тянуть ее заново. Да еще забыл вариант что может WebBrowser и WebClient получать разные выдачи в зависимости от UserAgent, Cookies, да еще стада параметров о которых я и не предполагаю:(

    29 февраля 2012 г. 12:37
  • > как мне получить исходную загруженную страницу 
      
     
    как вариант можно обойти DOM. примерно так:
     

     

    using System;
    using System.Text.RegularExpressions;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                this.Size = new System.Drawing.Size(500, 500);
                var rtb = new RichTextBox { Parent = this, Dock = DockStyle.Fill };
                Action<string, int> cb = (n, indent) => rtb.AppendText("\n" + new string(' ', indent * 4) + n);
                var html = @"
                <!doctype html>
                <html>
                    <head>
                        <script id='x1' language='xml'>
                            <xml1><item id='1' /></xml1>
                        </script>
                    </head>
                    <body style='background-color: whitesmoke;'>
                        <div>hello</div>
                        <script id='x2' language='xml'>
                            <xml2><item id='1' /></xml2>
                        </script>
                    </body>
                </html>";
                new WebBrowser { DocumentText = html }
                    .DocumentCompleted += (s, e) =>
                    {
                        var wb = s as WebBrowser;
                        dynamic doc = wb.Document.DomDocument;
                        TraverseHtml(doc, cb);
                    };
            }
    
            void TraverseHtml(dynamic n, Action<string, int> cb, int indent = 0)
            {
                var nn = (string)n.nodeName;
                if(n.hasAttributes)
                {
                    foreach (dynamic a in n.attributes)
                    {
                        if(a.specified)
                            nn += " " + (string) a.nodeName;
                    }
                }
                if (nn == "SCRIPT")
                {
                    if (string.Equals((string)n.getAttribute("language"), "xml", StringComparison.OrdinalIgnoreCase))
                        cb("<XML>" + Regex.Replace((string)n.XMLDocument.xml, "[\n\r]", " ") + "</XML>", indent);
                }
                else
                    cb(nn, indent);
    
                if ((bool)n.hasChildNodes)
                {
                    foreach (dynamic cn in n.childNodes)
                        TraverseHtml(cn, cb, indent + 1);
                }
            }
        }
    }
     
     
    • Изменено Malobukv 12 марта 2012 г. 5:34
    • Предложено в качестве ответа Malobukv 13 марта 2012 г. 8:44
    12 марта 2012 г. 5:33
  • Откройте в ie лубое изображение и потом сохраните документ вашим способом, увидите чего он там подокидывал:)
    14 марта 2012 г. 8:37
  • > Откройте в ie лубое изображение и потом сохраните документ вашим способом, увидите чего он там подокидывал:)


    для следующего html:

    <!doctype html>
    <html>
        <head />
        <body>
            <img src='http://i1.social.s-msft.com/profile/u/avatar.jpg?displayname=malobukv' />
        </body>
    </html>


    пример выдает:

    #document
        #comment
        HTML
            HEAD
                TITLE
            BODY
                IMG src
                #text

     
       

    14 марта 2012 г. 9:47
  • Изображение и страничка содержащая изображение это несколько разные вещи.

    Для вас это будет нечто вроде: http://i1.social.s-msft.com/profile/u/avatar.jpg

    2 апреля 2012 г. 7:39