当前位置: 首页 > 编程语言 > C#

如何从WebBrowser控件中获取XML(RAW-SOURCE)Share

时间:2023-04-10 21:27:19 C#

如何从WebBrowser控件中获取XML(RAW/SOURCE)XML文件并尝试将内容保存回.NetDocumentCompleted事件和DelphionNavigateComple2事件中的XML文件。问题是我总是得到将由浏览器转换以查看的HTML(检查我的输出:我使用以下代码保存它)过程TForm1.SaveHTMLSourceToFile(constFileName:string;WB:TWebBrowser);varPersistStream:IPersistStreamInit;文件流:TFileStream;流:IStream;保存结果:HRESULT;beginPersistStream:=WB.DocumentasIPersistStreamInit;FileStream:=TFileStream.Create(文件名,fmCreate);尝试Stream:=TStreamAdapter.Create(FileStream,soReference)作为IStream;:=PersistStream.Save(Stream,True);ifFAILED(SaveResult)thenMessageBox(Handle,'Failtosavesource','Error',0);最后是FileStream.Free;结尾;结尾;搜索了几乎所有内容,但到目前为止找不到任何有用的东西。使用下面的Delphi代码我可以展示SOURCE是如何工作的(这意味着源代码在那里)但是我不能使用它因为它会播放一个对话框并且获取数据并关闭对话框并不容易(在我的测试用例中间)我得到notepad.exe和我的xml内容)AWebBrowser.Document.QueryInterface(IOleCommandTarget,CmdTarget);如果CmdTarget为nil,则尝试CmdTarget.Exec(PtrGUID,HTMLID_VIEWSOURCE,0,vaIn,vaOut);最后CmdTarget._Release;结束;我还设法使用xxx-HIDE-xxx标志调用SAVEAS调用,但它连接了IE5,因为将显示对话框(隐藏的标志将被忽略)。我也尝试从缓存(CacheAPI)获取XML数据,但在我的情况下我没有得到任何东西2.如果客户端机器上的缓存被禁用怎么办??InnerText或InnerHTMLatc。不能使用,因为它们包含-和+字符并且不代表原始RAW数据(源)仅供参考:我无法使用WebClient或Indy组件访问xml。我也不能充当代理,因为在客户端计算机上打开端口(如8080)的问题对于特权用户访问来说是一个痛苦。所以我在这里问你是否知道如何解决我的问题?提前致谢并欢呼输入:xxxx输出:BODY{font:x-small'Verdana';margin-right:1.5em}.c{cursor:hand}.b{color:red;font-family:'CourierNew';font-weight:bold;text-decoration:none}.e{margin-left:1em;text-indent:-1em;margin-right:1em}.k{margin-left:1em;text-indent:-1em;margin-right:1em}.t{color:#990000}.xt{color:#990099}.ns{color:red}.dt{color:green}.m{color:blue}.tx{font-weight:bold}.db{text-indent:0px;margin-left:1em;margin-top:0px;margin-bottom:0px;padding-left:.3em;border-left:1pxsolid#CCCCCC;font:smallCourier}.di{font:smallCourier}.d{color:blue}.pi{color:blue}.cb{text-indent:0px;margin-left:1em;margin-top:0px;margin-bottom:0px;padding-left:.3em;font:smallCourier;color:#888888}.ci{font:smallCourier;color:#888888}PRE{margin:0px;display:inline}-xxxx我认为你的做法是错误的。TWebBrowser控件是用于查看的可视化控件。您可以从中提取底层数据,但从根本上使用可视化控件(非可视化操作)下载某些内容并不是一个好方法。相反,您应该使用专用API下载文件。仅供参考:我无法使用WebClient或Indy组件访问xml。我也不会玩特工……你有组件吗?在这种情况下,我建议您使用以下方法之一:TDownloadURL是一个内置类,可用于简单的文件下载。使用它的一些例子:InternetReadFile。这是我个人在自己的代码中使用的——我有一个小的线程类,它异步下载文件并在完成时通知主线程,使用这个函数实现。使用它:抱歉,我不能发布源代码,但它们是简单的函数,您应该会发现它很容易编写。这些方法将获取文件或缓冲区,每个文件或缓冲区都包含XML文件的原始内容。编辑:我看到你解释了为什么你不能使用Indy:“真实场景非常复杂,需要用户在浏览器中进行交互,在用户完成所有操作后,浏览器和用户之间会有一些帖子,直到最后结果是一个XML文件,您无法控制它的来源!”我不确定这会阻止您使用Indy:相反,您只需要获取此XML的位置。管不了的地方不要紧,只要弄清楚它在哪儿就行了。如果您只有一个链接(您已经可以从浏览器中获取HTML-事实上,那是您的问题!)或者查看TWebBrowser文档的最终位置,然后下载它。换句话说,让用户做任何他们必须做的事情来导航到最终的XML文件,而不是尝试从Web浏览器控件中提取它,而是自己下载它。您可以在TWebBrowserBeforeNavigate2事件中执行文件的“影子”下载。通过隐藏,我的意思是在TWebBrowser下载文件时使用来自另一个库的进程来下载文件。这样你就可以在不被TWebBrowser修改的情况下获取文件。我编写了一个测试应用程序,我所要做的就是获取文件内容过程TForm1.WebBrowserBeforeNavigate2(Sender:TObject;constpDisp:IDispatch;varURL,Flags,TargetFrameName,PostData,Headers:OleVariant;varCancel:WordBool);开始HttpGetText(URL,Memo1.Lines);结尾;HttpGetText是Synapse库中的一个阻塞函数http://www.ararat.cz/synapse/doku.php/start您也可以使用ICS、Indy或TDownLoadURL。请注意,TDownLoadURL没有阻塞,我永远无法让AfterDownload事件起作用。以上就是C#学习教程:如何从WebBrowser控件中获取XML(RAW/SOURCE)共享的所有内容。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: