VBA XML选择命名空间问题

5

我相信这是可以解决的,只是我通常不需要在VBA XML代码中处理XML命名空间。所以,我们有一个文件,实际上是一个名为Flag_of_the_United_Kingdom.svg的SVG文件,以下是文件内容:

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 30" width="1200" height="600">
  <clipPath id="t">
    <path d="M30,15 h30 v15 z v15 h-30 z h-30 v-15 z v-15 h30 z"/>
  </clipPath>
  <path d="M0,0 v30 h60 v-30 z" fill="#00247d"/>
  <path d="M0,0 L60,30 M60,0 L0,30" stroke="#fff" stroke-width="6"/>
  <path d="M0,0 L60,30 M60,0 L0,30" clip-path="url(#t)" stroke="#cf142b" stroke-width="4"/>
  <path d="M30,0 v30 M0,15 h60" stroke="#fff" stroke-width="10"/>
  <path d="M30,0 v30 M0,15 h60" stroke="#cf142b" stroke-width="6"/>
</svg>

这只是一个示例SVG文件,但对于其他SVG文件也适用。为了使Internet Explorer能够呈现该文件,需要在根元素上添加命名空间属性。
然而,我想在VBA中打开一个SVG文件并开始操作它,但我的代码遇到了命名空间问题。这是我的代码,它位于同一目录下工作簿中的标准模块中...
Option Explicit

Sub LoadSVGFile()
    '* Tools->References->Microsoft Xml, v6.0

    Dim fso As Object
    Set fso = VBA.CreateObject("Scripting.FileSystemObject")

    Dim sSVGPath As String
    sSVGPath = fso.BuildPath(ThisWorkbook.Path, "Flag_of_the_United_Kingdom.svg")
    If fso.FileExists(sSVGPath) Then

        Dim dom As MSXML2.DOMDocument60
        Set dom = New MSXML2.DOMDocument60

        dom.Load sSVGPath

        Debug.Assert dom.parseError = 0

        'xmlns="http://www.w3.org/2000/svg
        'dom.namespaces.Add "http://www.w3.org/2000/svg", "xmlns"

        dom.setProperty "SelectionNamespaces", "xmlns=""http://www.w3.org/2000/svg"""
        'Call dom.setProperty("SelectionLanguage", "XPath")

        Dim xmlSVG As MSXML2.IXMLDOMElement
        Set xmlSVG = dom.SelectSingleNode("svg")
        Debug.Assert Not dom.SelectSingleNode("svg") Is Nothing
        Debug.Assert Not dom.SelectSingleNode("/svg") Is Nothing

        If xmlSVG Is Nothing Then End

        '* rest of code follows here but is not shown
        Debug.Print "'* rest of code follows here but is not shown"
    End If

End Sub

上述代码在我从根元素中删除命名空间属性后有效,但这样做不好,因为这些文件是由Inkscape等生成的。
我确定这是一个SelectionNamespaces属性问题,但我无法让它工作,我相信有人可以轻松解决这个问题。
更新:在https://support.microsoft.com/en-gb/kb/288147上搜索发现这是预期的行为。

这似乎是 https://dev59.com/4Zjga4cB1Zd3GeqPHkTb#37976526 的副本。 - Stefan Pinnow
1个回答

5
据我所记,selectionNamespace是一个在选择语言(xPath)中用于命名空间/前缀列表。它用于在xPath中切换命名空间。可以尝试以下操作:
 dom.setProperty "SelectionNamespaces", "xmlns:svg=""http://www.w3.org/2000/svg"""

    Dim xmlSVG As MSXML2.IXMLDOMElement
    Set xmlSVG = dom.SelectSingleNode("svg:svg")
    Debug.Assert Not dom.SelectSingleNode("svg:svg") Is Nothing
    Debug.Assert Not dom.SelectSingleNode("/svg:svg") Is Nothing

补充:我已经有一段时间没有使用Windows了,所以不能保证任何事情 :-(


1
很遗憾,考虑到我编辑进问题中的链接,这看起来是正确的,但我不希望引入一个虚假的命名空间。 - S Meaden
1
这并不是一个伪造的命名空间,它只是一个前缀,用于告诉xPath你正在谈论哪个命名空间。该命名空间是http://www.w3.org/2000/svg部分。我认为你想要告诉xPath将svg命名空间视为默认命名空间。但我认为这是不可能的... - Holger Will

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接