我正在尝试编写将筛选此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。我从中得到了理想的结果。这使我相信以下一个正在发生:
- 您较早的XMLRESP并未很好地形成。您可以检查它还是导出OBJXML以查看是否正确形成?
- 对于VBA的MSXML2,您的输入字符串太大。我曾经发生这种情况,在我身上,来自Adobe的XFDF数据超过了一些最大字符串长度,从而导致输入未正确形成。当我在VBA外面跑了XSL或用长字符串删除了场时,它起作用了。
- 如何处理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库。