2017-01-18 5 views
1

これは解決できると確信していますが、通常はVBA XMLコードのXMLネームスペースを処理する必要はありません。そこで、我々は、これは単なる例でSVGファイルですが、Internet Explorerがレンダリングすることは、他の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ファイルが Flag_of_the_United_Kingdom.svgと呼ばれているファイルを持っており、ここにありますファイルにはルート要素の名前空間属性が必要です。

しかし、私は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

によって生成されますが、私はそれが仕事を得ることができない、私は誰かがこれを簡単に解決できると確信しています。

UPDATE:この上に周りのグーグルで、これは私が覚えている限りでは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を使用するのでしばらくしているので、私は、私はこれが正しい見えますが、私の質問に編集リンク与えられた、悲しいこと

+1

:-(何かをgaranteeすることはできません –

+1

これは偽の名前空間ではなく、あなたが話している名前空間とxPathに伝える接頭辞です。 名前空間は「http://www.w3.org」です。/2000/svg'-part xPathにsvg名前空間を既定の名前空間として扱わなければならないと思っていますが、それは可能だと思います... –

+1

大丈夫、強い言語のためにお詫び申し上げます。 DankefürIhre Hilfe –

関連する問題