如何通过“id”查找元素使用 Python 的 SVG 文件中的字段
以下是 .svg 文件(即 xml)的摘录:
<text
xml:space="preserve"
style="font-size:14.19380379px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans Mono;-inkscape-font-specification:DejaVu Sans Mono"
x="109.38555"
y="407.02847"
id="libcode-00"
sodipodi:linespacing="125%"
inkscape:label="#text4638"><tspan
sodipodi:role="line"
id="tspan4640"
x="109.38555"
y="407.02847">12345678</tspan></text>
我正在学习 Python,但不知道如何找到所有具有 id
的 text
元素字段等于libcode-XX
,其中XX是一个数字。
我已经使用 minidom 的解析器加载了这个 .svg 文件,并尝试使用 getElementById
查找元素。但是我得到了 None
结果。
svgTemplate = minidom.parse(svgFile)
print svgTemplate
print svgTemplate.getElementById('libcode-00')
在处理其他问题时,我尝试在 svgTemplate
对象上使用 setIdAttribute('id')
,但没有成功。
底线:请提供一种智能方法的提示,以提取所有这些具有 libcode-XX
形式的 id
的 text
元素。之后,获取 tspan 文本并将其替换为生成的内容应该没有问题。
Below is an excerpt from an .svg file (which is xml):
<text
xml:space="preserve"
style="font-size:14.19380379px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans Mono;-inkscape-font-specification:DejaVu Sans Mono"
x="109.38555"
y="407.02847"
id="libcode-00"
sodipodi:linespacing="125%"
inkscape:label="#text4638"><tspan
sodipodi:role="line"
id="tspan4640"
x="109.38555"
y="407.02847">12345678</tspan></text>
I'm learning Python and have no clue how can I find all such text
elements that have an id
field equal to libcode-XX
where XX is a number.
I've loaded this .svg file using minidom's parser and tried to find elements using getElementById
. However I'm getting None
result.
svgTemplate = minidom.parse(svgFile)
print svgTemplate
print svgTemplate.getElementById('libcode-00')
Going after other SO question I've tried using setIdAttribute('id')
on svgTemplate
object with no luck.
Bottom line: please give a hint for a smart way to extract all of these text
elements that have id
s in form of libcode-XX
. After that it should be no problem to get tspan
text and substitute it with generated content.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
抱歉,我不知道如何绕过迷你王国。另外,我必须从示例 svg 文档中找到名称空间声明,以便可以加载您的摘录。
我个人使用lxml.etree。我建议您使用 XPATH 来寻址 XML 文档的各个部分。它非常强大,如果您遇到困难,这里可以提供帮助。
SO 上有很多关于 XPATH 和 etree 的答案。我已经写了好几篇了。
Sorry, I don't know my way around minidom. Also, I had to find the namespace declarations from a sample svg document so that your excerpt could load.
I personally use lxml.etree. I'd recommend that you use XPATH for addressing parts of your XML document. It's pretty powerful and there's help here on SO if you're struggling.
There are lots of answers on SO about XPATH and etree. I've written several.
如果将 'id' 替换为 'xml:id' 是否有效?
如果 minidom 不知道 svg,它可能会将“id”属性视为任何其他属性,而不是 ID 类型。符合标准的 svg 实现会将 svg 内容中的“id”属性识别为 ID 类型,并且如果文件被适当标记,则加载外部 DTD 的 xml 实现也应该正确识别它。在 XML 中加载外部 DTD 是可选的,因此解决此问题的正确方法是使解析器能够识别 svg。
SVG 1.1 DTD 中“id”的定义: http://www. w3.org/TR/SVG11/svgdtd.html#DTD.1.4
Does it work if you replace 'id' with 'xml:id'?
If minidom doesn't know svg it might treat the 'id' attribute as just any other attribute, instead of being of type ID. A conforming svg implementation would recognize the 'id' attribute in svg content as being of type ID, and an xml implementation that loads external DTDs should also recognize it correctly if the file is tagged appropriately. Loading external DTDs is optional in XML, so the proper way of fixing this would be to make the parser svg-aware.
Definition of 'id' in SVG 1.1 DTD: http://www.w3.org/TR/SVG11/svgdtd.html#DTD.1.4
当您使用 xpath 并且知道命名空间时,可以在 MattH 的优秀示例中添加一点,您可以执行类似这样的操作,
这将允许直接访问您想要的元素标记文本。
Adding a little bit to MattH's great example when you use xpath and you know the namespace you can do things like
This will give direct access to the element tag text that you want.