XPath在VBA中返回字符串或布尔值?

时间:2010-11-07 00:01:39

标签: vba vb6 ms-word xpath

Word宏执行XPath表达式的最简单方法是:

"string(/alpha/beta)" 

"not(string(/alpha/beta)='true')" 

应该分别返回字符串和布尔值? (与xml节点或节点列表相对)

我想避免在运行Office 2007或2010的计算机上不存在的DLL。

函数selectSingleNode(queryString As String)返回一个IXMLDOMNode,因此不会这样做。

换句话说,类似于.NET的xpathnavigator.evaluate [1],这是做什么的?

[1] http://msdn.microsoft.com/en-us/library/2c16b7x8.aspx

1 个答案:

答案 0 :(得分:3)

您可以使用XSL转换来评估XPath表达式,特别是xsl:value-of

我编写了Evaluate函数,该函数基于此原理。它在内存中创建一个XSL样式表,其中包含一个XSL模板,该模板将获取XPath表达式,对其进行评估,并返回包含<result>节点中结果的新XML文档。它会检查以确保value-of返回了某些内容(如果没有则返回错误),如果是,则将XPath表达式的结果转换为以下数据类型之一:Long,{{ 1}},DoubleBoolean

以下是我用来练习代码的一些测试。我使用了您链接到的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