VBA XML 选择命名空间问题 [英] VBA XML Selection Namespace issue

查看:34
本文介绍了VBA XML 选择命名空间问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我确定这是可以解决的,但这只是我通常不必在 VBA XML 代码中处理 XML 命名空间.所以,我们有一个文件,它实际上是一个名为 Flag_of_the_United_Kingdom.svg 的 SVG 文件,这里是文件内容

So I'm sure this is solvable, but it's just I don't normally have to deal with XML namespaces in VBA XML code. So, we have a file which is in fact an SVG file called Flag_of_the_United_Kingdom.svg and here is the file contents

<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 呈现文件,它需要根元素上的命名空间属性.

This is just an example SVG file, but it holds for other SVG files, for Internet Explorer to render the file it needs the namespace attribute on the root element.

但是,我想在 VBA 中打开一个 SVG 文件并开始操作它,但我的代码在命名空间问题上遇到了问题.这是我的代码,它位于同一目录下工作簿的标准模块中......

However, I want to open an SVG file in VBA and start manipulating it and my code is tripping on the namespace issue. Here is my code which is housed in a standard module in a workbook in same directory ...

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 等生成的.

The above code works when I have removed the namespace attribute from the root element, but that is no good because these files get generated by Inkscape etc.

我确定这是一个 SelectionNamespaces 属性问题,但我无法让它工作,我确定有人可以轻松解决这个问题.

I'm sure it is a SelectionNamespaces property issue, but I cannot get it to work, I'm sure someone could solve this easily.

更新:谷歌搜索看起来这是预期的行为 https://support.microsoft.com/en-gb/kb/288147

UPDATE: Googling around on this looks like this is the expected behaviour re https://support.microsoft.com/en-gb/kb/288147

推荐答案

据我所知, selectionNamespace 是在选择语言 (xPath) 中使用的命名空间/前缀列表.它用于在 xPath 中的命名空间之间切换.像这样尝试:

as far as i remember, selectionNamespace is a list of namspaces/prefixes for use in the selection language (xPath). It is used to switch between namespaces in xPath. Try it like this:

 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

P.S.:我上次使用 Windows 已经有一段时间了,所以我不能保证任何东西:-(

P.S.: It's been a while since i last used Windows, so i can not garantee anything :-(

这篇关于VBA XML 选择命名空间问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆