如何在iOS上使用XPath访问SVG部件

时间:2019-06-24 07:30:34

标签: xml svg xpath

我想通过使用iOS项目上的XPath访问SVG文件中的值。

我已经找到了一些库(Fuzi,Ono,RaptureXML,Kanna)并将它们集成到我的项目中。它们对于简单的XML文件都可以正常工作,但是当我使用真正的SVG文件(基本上是XML)时,它将停止工作。

对于以下抠图SVG文件,我尝试了几种XPath表达式。

<svg width="834px" height="707.5px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" overflow="visible">
    <defs>
        <symbol id="E003" viewBox="0 0 1000 1000" overflow="inherit">
            <path transform="scale(1,-1)" d="M0 -0c49 0 97.5 -2.26367 135.5 4.73633c206 95 258.5 264.264 263.5 271.264c0 1 -14 7 -15 6c-88 -154 -251 -167 -321 -170c-1 0 -63 -1 -63 -1v-111z" />
        </symbol>
        <symbol id="E004" viewBox="0 0 1000 1000" overflow="inherit">
            <path transform="scale(1,-1)" d="M0 0c49 0 97.5 2.26367 135.5 -4.73633c206 -95 258.5 -264.264 263.5 -271.264c0 -1 -14 -7 -15 -6c-88 154 -251 167 -321 170c-1 0 -63 1 -63 1v111z" />
        </symbol>
    </defs>
</svg>

XPath表达式: /svg //symbol //symbol[@id='E004']

我发现,如果从SVG文件中删除了命名空间定义xmlns="http://www.w3.org/2000/svg",XPath表达式就会起作用。

所以我注册了类似(Fuzi示例)的名称空间:

document.definePrefix("", forNamespace: "http://www.w3.org/2000/svg")
document.definePrefix("svg", forNamespace: "http://www.w3.org/2000/svg")
document.definePrefix("xlink", forNamespace: "http://www.w3.org/1999/xlink")

但是这些表达仍然无效。

该XPath表达式//symbol[@id='E004']需要哪个库,XPath表达式或更改才能获得以下结果?

Element='<symbol xmlns="http://www.w3.org/2000/svg"
        id="E004"
        overflow="inherit"
        viewBox="0 0 1000 1000">
            <path d="M0 0c49 0 97.5 2.26367 135.5 -4.73633c206 -95 258.5 -264.264 263.5 -271.264c0 -1 -14 -7 -15 -6c-88 154 -251 167 -321 170c-1 0 -63 1 -63 1v111z"
         transform="scale(1,-1)"/>
</symbol>' 

1 个答案:

答案 0 :(得分:1)

要访问SVG元素,xpath必须以//*[name()='svg']//*[local-name()='svg']开头

要获取以上元素,您的xpath应该如下:

//*[name()='svg']//*[@id='E004']

OR

//*[local-name()='svg']//*[@id='E004']

OR

//*[local-name()='svg']//*[local-name()='symbol'][@id='E004']

OR

 //*[name()='svg']//*[name()='symbol'][@id='E004']