【问题标题】:Parsing XML: Math Equations - SVG Example解析 XML:数学方程 - SVG 示例
【发布时间】:2020-05-31 14:47:04
【问题描述】:

我想挑选出数学方程的 SVG 中使用的每个符号的位置和字体大小。

我正在使用 Python XML 解析库:xml.etree.ElementTree (https://docs.python.org/3/library/xml.etree.elementtree.html)。

这是我正在使用的 SVG 示例:

example_svg = '''<svg style="vertical-align:-10.2252022445128pt" xmlns="http://www.w3.org/2000/svg" width="193pt" height="31pt" viewBox="-1 -1 193 31">
<path d="M43.875 16.305h20.426" fill="none" stroke-width=".914" stroke="#000" stroke-miterlimit="10"></path>
<g font-family="MathFont" font-size="13.5">
<text y="11.168" x="45.874">3</text>
<text y="11.168" x="52.532">????</text> 
<text y="28.382" x="50.758">4</text>
</g>
<g font-family="MathFont" font-size="9.45">
<text y="6.327" x="60.453">3</text></g>
</svg>'''    

在 Latex 中,等式是 $\frac{3x^3}{4}$。

使用以下代码几乎可以满足我的所有需求,但我似乎无法将其与组文本中的属性联系起来。理想情况下,我希望输出为 (symbol, y_coord, x_coord, font-family, font-size)。

import xml.etree.ElementTree as ET

root = ET.fromstring(example_svg)

for tag in root.findall('.//{http://www.w3.org/2000/svg}text'):
  symbol = tag.text
  y_coord = tag.get('y')
  x_coord = tag.get('x')
  print(symbol, y_coord, x_coord)

【问题讨论】:

  • 字体和大小在另一个标签中,而不是在&lt;text&gt;中。所以这就是为什么你看不到他们。 etree 是否允许访问元素的 parent
  • @usr2564301 这是一个有用的评论,它引导我到stackoverflow.com/questions/2170610/… 我只是在跟踪它,看看它是否能解决问题。
  • @usr2564301 感谢您的帮助。我认为一切都源于此:对于 root.getiterator() 中的父级:对于父级中的子级:print(child.tag, child.attrib, parent.tag, parent.attrib)
  • 另一种选择可能对 XML 更“自然”:循环遍历所有 &lt;g&gt; 元素,并在其中循环遍历它们的 &lt;text&gt; 子元素。

标签: python xml math svg


【解决方案1】:

字体系列名称和大小不在&lt;text&gt; 元素中指定,而是在其父&lt;g&gt; 组中指定。一定要小心,因为多个 &lt;g&gt; 元素可能会相互嵌套。

您可以使用find_all 定位所有&lt;g&gt; 元素并临时存储字体参数,但如果您尝试这样做先找到&lt;g&gt;,然后再找到它的&lt;text&gt;s,您很快就会发现它不能正确处理嵌套组。每次出现&lt;g&gt; 都会触发寻找其包含的&lt;text&gt; 元素,所以如果有一组嵌套的

<g group parameters> <g text parameters> <text>your text</text> </g> </g>

然后它将报告所有&lt;text&gt; 元素两次:每个(嵌套与否)&lt;g&gt; 一次。

那么,更好的方法是遍历整个 XML 文件,并在遇到它时存储字体信息。

root = ET.fromstring(example_svg)

font = None
font_size = None
for elem in root.iter():
    if elem.tag == '{http://www.w3.org/2000/svg}g':
        item = elem.get('font-family')
        if item is not None:
            font = item
        item = elem.get('font-size')
        if item is not None:
            font_size = item

    elif elem.tag == '{http://www.w3.org/2000/svg}text':
        symbol = elem.text
        y_coord = elem.get('y')
        x_coord = elem.get('x')
        print (symbol, y_coord, x_coord, font, font_size)

(请注意,iter() 需要为每个元素添加完整的 SVG 命名空间。)

结果:

3 11.168 45.874 MathFont 13.5
? 11.168 52.532 MathFont 13.5
4 28.382 50.758 MathFont 13.5
3 6.327 60.453 MathFont 9.45

【讨论】:

    猜你喜欢
    • 2013-07-18
    • 2011-12-18
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    相关资源
    最近更新 更多