我想通过使用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>'
答案 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']