从网络浏览器组件读取 XML

Read XML from a webbrowser component

我有一个应用程序,可以在 NavUserPassword 身份验证后为个人提供网络浏览器组件中 XML 页面的预览,然后显示一个将其解析为有意义数据的侧面板。但是,我似乎无法找到一种有效的方法来通过字符串将所有 XML 从 webbrowser 组件中导出。

未经身份验证的网页示例是,https://services.odata.org/Northwind/Northwind.svc/

我在下面有这段代码,尽管它会抛出 MssingMemberExeption "Public member 'XMLDocument' on type 'HTMLDocumentClass' not found."

Private Sub WebBrowserAuthEx1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowserAuthExt1.DocumentCompleted
    Dim doc As XmlDocument = New XmlDocument()
    doc.LoadXml(WebBrowserAuthExt1.Document.DomDocument.XMLDocument) ' I throw MssingMemberExeption
    MessageBox.Show(doc.Value.ToString)
End Sub

如何在网络浏览器中获取此 XML DOM 以提供所有 XML?

它与普通的网络浏览器相同,但是 XML 必须从中出来,因为它已经过身份验证,我不想验证另一个流。

如果这是内置的 System.Windows.Forms.WebBrowser 控件,您可以使用 DocumentText property 获取网站的 HTML(基本上是 XML)代码。

doc.LoadXml(WebBrowserAuthExt1.DocumentText)

对于您提供的示例Url,您可以使用类似以下代码的方式获得xml:

Dim xmlText As String = WebBrowser1.Document.All.Item(0).InnerText

编辑:OP 指出(在被拒绝的编辑中)上面 returns 返回的文本在某些行上有一个“-”。这是源被格式化为树结构而不是 pure XML 的结果。他们的解决方案如下:

' It also includes the code folding dashes, use the below to sanitize the data.
If xmlText <> Nothing Then
    xmlText = xmlText.Replace("- ", "")
End If

这种 Replace 的用法存在数据意外修改的风险,我只是想建议以下替代方案,将潜在的更改限制在行的开头。

Dim sb As New System.Text.StringBuilder(xmlText.Length)
Using sr As New System.IO.StringReader(xmlText)
    Do While sr.Peek <> -1
        Dim line As String = sr.ReadLine()
        Dim startOfLineIndex As Int32 = sb.Length
        sb.AppendLine(line)
        If sb.Chars(startOfLineIndex) = "-"c Then sb.Chars(startOfLineIndex) = " "c
    Loop
End Using
xmlText = sb.ToString()