目前,企業中對XML的應用愈來愈普遍,做爲自動化測試的測試工程師,也應該掌握XML的讀寫操做。
如下我使用XML DOM技術演示一個例子,用以讀取XML指定節點的節點內容值。
讀取函數原型 GetXml strXmlPath,nodeName
這個函數的第一個參數表示xml文件所在路徑,第二個參數表示但願獲取到的xml節點名,請結合下列例子看
首先,新建一個vbs文件(取個名字叫readXml.vbs),輸入代碼:
Dim strXMLjavascript
GetXml "c:search.xml","TestResult" '這個函數的第一個參數表示xml文件所在路徑,第二個參數表示但願獲取到的xml節點名,請結合下列例子看
MsgBox strXMLhtml
Function GetXml (ByVal strXmlFilePath,ByVal xmlNodeName)
Dim xmlDoc,xmlRoot
Set xmlDoc = CreateObject("Microsoft.XMLDOM") '建立XML DOM對象
xmlDoc.async = False '控制加載模式爲同步模式(xml樹加載完畢後再執行後續代碼)
xmlDoc.load strXmlFilePath '載入xml文件
If xmlDoc.parseError.errorCode <> 0 Then
MsgBox "XML文件格式不對,緣由是:" & Chr(13) & xmlDoc.parseError.reason
Exit Function
End If
Set xmlRoot = xmlDoc.documentElement
xmlRecursion xmlRoot,xmlNodeName '調用xml遞歸函數傳入指定的根和節點名
GetXml = True 'xmlRecursion (xmlRoot)
End Functionjava
Function xmlRecursion(byval xmlNode,byval strNodeName)
If xmlNode.nodeName = strNodeName And xmlNode.hasChildNodes Then
If xmlNode.childNodes.item(0).nodeName = "#text" Then
strXML = strXML & xmlNode.nodeName & ":" & xmlNode.childNodes.item(0).nodeValue & Chr(13)
End If
End If
If xmlNode.hasChildNodes Then
For Each childNodeItem In xmlNode.ChildNodes
If childNodeItem.hasChildNodes Then
xmlRecursion childNodeItem,strNodeName
End If
Next
End If
End Function
問題:
haschildnodes()這個方法好奇怪,明明已經沒有子節點了,卻仍然返回true,
好比<TestResult>1</TestResult>這個節點,它的childNodes.item(0).nodeName居然是「#text」,可是根據例子來看TestResult已經沒有子節點了阿
回答:
由於在xml有一個特殊的「子節點」——文本節點。好比 <TestResult>100</TestResult>
這個節點TestResult下並非沒有子節點,而是有一個文本節點,這個節點的nodeName就是「#text」,而nodeValue是100.若是是 <TestResult/> 這種節點的話,那麼用hasChildNodes則返回False
遍歷xml的代碼:
Option Explicit
Dim xmlDoc,myErr,strXML
Set xmlDoc = CreateObject("Microsoft.XMLDOM")
xmlDoc.async = False
xmlDoc.load "c:calc1.xml"
If xmlDoc.parseError.errorCode <> 0 Then
Set myErr = xmlDoc.parseError
MsgBox("XML Loads Failed. " & myErr.reason)
Else
Set rootNode = xmlDoc.documentElement
Call rTravel(rootNode)
MsgBox strXML
End Ifnode
Sub rTravel (rNode)
Dim blnTwo,intTestCase,
blnTwo = False
iLen = rNode.childNodes.length
If iLen > 0 Then
For i = 0 To rNode.childNodes.length -1
Set child = rNode.childNodes.item(i)
Call rTravel(child)
childtext = child.nodeValue
strXML = strXML & childtext & chr(13)
Next
Else
Exit Sub
End If
End Subweb
方法二:
Option Explicit
Dim xmlDoc,myErr,strXMLasync
Set xmlDoc = CreateObject("Microsoft.XMLDOM")
xmlDoc.async = False
xmlDoc.load "c:calc1.xml"
If xmlDoc.parseError.errorCode <> 0 Then
Set myErr = xmlDoc.parseError
MsgBox("XML Loads Failed. " & myErr.reason)
Else
Set rootNode = xmlDoc.documentElement
Call rTravel(rootNode)
MsgBox strXML
End If
Sub rTravel (rNode)
Dim blnTwo,intTestCase,
blnTwo = False
iLen = rNode.childNodes.length
If iLen > 0 Then
For i = 0 To rNode.childNodes.length -1
Set child = rNode.childNodes.item(i)
Call rTravel(child)
childtext = child.nodeValue
strXML = strXML & childtext & chr(13)
Next
Else
Exit Sub
End If
End Sub函數