使用XML(VBA)解析DOM



我正在尝试编写将筛选此DOM结构的代码:

<html>
 <head>
  <body>
   <table id="the-table" border="1">
    <thead>
    <tbody>
     <tr> </tr>
     <tr>
      <td class="x-grid3-hd-inner" bgcolor="#8dd5e7" colspan="7">
     </tr>
     <tr>
      <td class="x-grid3-hd-inner" bgcolor="#8dd5e7" colspan="7">
     </tr>
     <tr>
     <tr>
      <td class="oneline">2</td>
      <td class="oneline">ENB</td>
      <td class="oneline">2</td>
      <td class="oneline">CELL_99</td>
      <td class="oneline">255.255.255.0</td>
      <td class="oneline">My Group</td>
      <td class="oneline">*</td>
     </tr>
     <tr>
     <tr>
     <tr>
     ...
     <tr>
     <tr>
   </tbody>
  </table>
 </body>
</html>

我试图为表的所有TR元素在每个TD元素上提取文本。我在上面扩展了一个示例。表的所有TD元素均使用相同的HTML结构(除表的标题)进行格式化。这是我到目前为止使用的方法。

Sub ParseWebPage(url As String, sheet As String, searchCrit As String)
    Dim objXML As MSXML2.DOMDocument
    Set objXML = New MSXML2.DOMDocument
    Set htm = CreateObject("htmlFile")
    With CreateObject("msxml2.xmlhttp")
      .Open "GET", url, False
      .send
      xmlresp = .responseText
    End With
    objXML.loadXML (xmlresp)
    Dim objElem As MSXML2.IXMLDOMElement
    Debug.Print xmlresp
    objXML.loadXML (xmlresp)
    Set objElem = objXML.selectSingleNode("tr")
    Debug.Print "Found" & objElem.text
End Sub

问题是,每当我的objelem返回空白时。我还尝试使用nodelist而不是ixmldomelement,但它总是空返回。

我相信这个问题是字符串参数。我尝试使用" tr"," oneline","/html/html/body/table/tbody",并为每个循环创建一个/html/html/body/table/table/tbody/tr [x]/td [y]但是这些都不是有效的。

有人可以在这里帮我吗?

Sub test()
  Dim objList As MSXML2.IXMLDOMNodeList
  Dim objxml As New MSXML2.DOMDocument
  Dim i As Integer
  objxml.Load ("C:test.xml") 'used load, loadXML would be correct for your use
  Set objList = objxml.SelectNodes("//tr/td")
  For i = 0 To objList.Length - 1
      Debug.Print objList.Item(i).Text
  Next i
End Sub

在以下内容上使用上述代码:

<html>
 <head>
  <body>
   <table id="the-table" border="1">
    <thead>
     <tbody>
      <tr>
      <td class="oneline">2</td>
      <td class="oneline">ENB</td>
      <td class="oneline">2</td>
      <td class="oneline">CELL_99</td>
      <td class="oneline">255.255.255.0</td>
      <td class="oneline">My Group</td>
      <td class="oneline">*</td>
     </tr>
   </tbody>
   </thead>
  </table>
 </body>
 </head>
</html>

将输入文件保存为.xml。我从中得到了理想的结果。这使我相信以下一个正在发生:

  1. 您较早的XMLRESP并未很好地形成。您可以检查它还是导出OBJXML以查看是否正确形成?
  2. 对于VBA的MSXML2,您的输入字符串太大。我曾经发生这种情况,在我身上,来自Adobe的XFDF数据超过了一些最大字符串长度,从而导致输入未正确形成。当我在VBA外面跑了XSL或用长字符串删除了场时,它起作用了。
  3. 如何处理XML和HTML之间存在差异。我对HTML并不那么熟悉,所以不能对您的代码的那部分发表评论

如果您要在TD的元素中获取所有文本(" 2"," ENB"等),请尝试以下内容:

Dim objList As MSXML2.IXMLDOMNodeList
Set objList = objXML.SelectNodes("//tr/td")
For i = 0 To objList.Length - 1
   Debug.Print objList.Item(i)
Next i

希望有效。没有时间进行测试,但是从我拥有的类似工作代码中复制。

Sub ParseWebPage(url As String, sheet As String, searchCrit As String)
 Dim objXML As MSXML2.DOMDocument
 Set objXML = New MSXML2.DOMDocument
 Set htm = CreateObject("htmlFile")
 Dim tableData() As String
 Dim openPos, closePos As Integer
 Dim midPart As String
 With CreateObject("msxml2.xmlhttp")
    .Open "GET", url, False
    .send
    xmlresp = .responseText
 End With
 objXML.loadXML (xmlresp)
 tableData = Split(xmlresp, searchCrit)
 For i = 12 To UBound(tableData) - 1
    openPos = InStr(tableData(i), Chr(34) & ">")
    closePos = InStr(tableData(i), "</td>")
    midPart = mid(tableData(i), openPos + 2, closePos - openPos - 2)
    Debug.Print midPart
 Next i
End Sub

现在这是一个确定的解决方案。但是,我将继续对该主题进行更多研究。我最终根本不使用XML库。

最新更新