2017-01-18 72 views
1

所以我相信這是可以解決的,但這只是我通常不必處理VBA XML代碼中的XML名稱空間。因此,我們有一個文件,它實際上是一個SVG文件名爲Flag_of_the_United_Kingdom.svg,這裏是該文件的內容VBA XML Selection命名空間問題

<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等

我敢肯定這是一個​​屬性問題,但我不能得到它的工作,我敢肯定有人可以很容易地解決這個問題。

更新:谷歌搜索圍繞這個看起來這是重新https://support.microsoft.com/en-gb/kb/288147

回答

1

預期的行爲,據我記得,selectionNamespace是在選擇語言(XPath)使用namspaces /前綴列表。它用於在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 

PS:這是一個,而自從我上次使用的Windows系統,因此,我不能garantee什麼:-(

+1

可悲的是給我編輯成問題的線路,這看起來是正確的,但我對於引入虛假的命名空間並不高興 –

+1

它不是一個虛假的命名空間,它只是一個前綴,用於告訴你所指的xPath命名空間。/2000/svg'-part。 我想你想要的是告訴xPath svg命名空間應該被視爲默認的命名空間,我不認爲這是可能的... –

+1

好的,爲強壯的語言道歉。 DankefürIhre Hilfe –