Word宏执行XPath表达式的最简单方法是:
"string(/alpha/beta)"
"not(string(/alpha/beta)='true')"
应该分别返回字符串和布尔值? (与xml节点或节点列表相对)
我想避免在运行Office 2007或2010的计算机上不存在的DLL。
函数selectSingleNode(queryString As String)返回一个IXMLDOMNode,因此不会这样做。
换句话说,类似于.NET的xpathnavigator.evaluate [1],这是做什么的?
答案 0 :(得分:3)
您可以使用XSL转换来评估XPath表达式,特别是xsl:value-of。
我编写了Evaluate
函数,该函数基于此原理。它在内存中创建一个XSL样式表,其中包含一个XSL模板,该模板将获取XPath表达式,对其进行评估,并返回包含<result>
节点中结果的新XML文档。它会检查以确保value-of
返回了某些内容(如果没有则返回错误),如果是,则将XPath表达式的结果转换为以下数据类型之一:Long
,{{ 1}},Double
或Boolean
。
以下是我用来练习代码的一些测试。我使用了您链接到的MSDN页面中的String
文件(如果要运行这些测试,则必须将路径更改为books.xml
。)
books.xml
以下是Public Sub Test_Evaluate()
Dim doc As New DOMDocument
Dim value As Variant
doc.async = False
doc.Load "C:\Development\StackOverflow\XPath Evaluation\books.xml"
Debug.Assert (doc.parseError.errorCode = 0)
' Sum of book prices should be a Double and equal to 30.97
'
value = Evaluate(doc, "sum(descendant::price)")
Debug.Assert TypeName(value) = "Double"
Debug.Assert value = 30.97
' Title of second book using text() selector should be "The Confidence Man"
'
value = Evaluate(doc, "descendant::book[2]/title/text()")
Debug.Assert TypeName(value) = "String"
Debug.Assert value = "The Confidence Man"
' Title of second book using string() function should be "The Confidence Man"
'
value = Evaluate(doc, "string(/bookstore/book[2]/title)")
Debug.Assert TypeName(value) = "String"
Debug.Assert value = "The Confidence Man"
' Total number of books should be 3
'
value = Evaluate(doc, "count(descendant::book)")
Debug.Assert TypeName(value) = "Long"
Debug.Assert value = 3
' Title of first book should not be "The Great Gatsby"
'
value = Evaluate(doc, "not(string(/bookstore/book[1]/title))='The Great Gatsby'")
Debug.Assert TypeName(value) = "Boolean"
Debug.Assert value = False
' Genre of second book should be "novel"
'
value = Evaluate(doc, "string(/bookstore/book[2]/attribute::genre)='novel'")
Debug.Assert TypeName(value) = "Boolean"
Debug.Assert value = True
' Selecting a non-existent node should generate an error
'
On Error Resume Next
value = Evaluate(doc, "string(/bookstore/paperback[1])")
Debug.Assert Err.Number = vbObjectError
On Error GoTo 0
End Sub
函数的代码(Evaluate
函数是帮助函数,使数据类型转换代码更具可读性):
注意: 在评论中提及barrowc,您可以通过将IsLong
替换为版本来明确指出要使用的MSXML版本 - 特定的类名称,例如DOMDocument
(MSXML3)或DOMDocument30
(MSXML6)。编写的代码将默认使用MSXML3,MSXML3目前部署得更广泛,但MSXML6具有更好的性能,并且是最新版本,是Microsoft目前推荐的版本。
有关不同版本的MSXML的详细信息,请参阅问题Which version of MSXML should I use?。
DOMDocument60