Python MiniDom 没有正确删除元素

Python MiniDom not removing elements properly

我正在将一段 JS 代码转换为 Python,我一直在使用 mini DOM,但某些事情无法正常工作。他们在 JavaScript 中运行时正在查找。我正在转换是因为我想要一致的更改/顺序(即添加 class 属性的位置),以及我可以使用一些更简单的 Python 功能。

我最近遇到的问题是:

fonts = doc.getElementsByTagName('font')

while(fonts.length > 0):
    # Create a new span
    span = doc.createElement("span")
    # Give it a class name based on the color (colors is a map)
    span.setAttribute("class", colors[fonts[0].getAttribute("color")])

    # Place all the children inside
    while(fonts[0].firstChild):
        span.appendChild(fonts[0].firstChild)
    # end while

    # Replace the <font> with a the <span>
    print(fonts[0].parentNode.toxml())
    fonts[0].parentNode.replaceChild(span, fonts[0])
# end while

问题在于,与 JavaScript 不同的是,该元素并未按应有的方式从 fonts 中删除。有没有我应该使用的更好的库,它使用标准(3 级)DOM 规则,或者如果我不想使用 xPath(所有其他 DOM 解析器似乎使用)?

谢谢。

您可以在 the documentation 中看到 Python DOM(页面最底部)它不像 "real" DOM从某种意义上说,你从 getElementsByTagName 得到的 collections 不是 "live"。在此处使用 getElementsByTagName 只是当时匹配元素的静态快照 returns。这通常不是 Python 的问题,因为当您使用 xml.dom 时,您并不是在浏览器中使用 live-updating 页面;您只是在操纵从文件或字符串解析的静态 DOM,因此您知道没有其他代码会在您不注意时弄乱 DOM。

在大多数情况下,您可以通过更改代码结构来反映这一点,从而获得您想要的结果。对于这种情况,您应该能够通过以下方式实现您的目标:

fonts = doc.getElementsByTagName('font')

for font in fonts:
    # Create a new span
    span = doc.createElement("span")
    # Give it a class name based on the color (colors is a map)
    span.setAttribute("class", colors[font.getAttribute("color")])

    # Place all the children inside
    while(font.firstChild):
        span.appendChild(font.firstChild)
    # end while

    # Replace the <font> with a the <span>
    font.parentNode.replaceChild(span, font)

我们的想法是,您不必总是查看 fonts 中的第一个元素,而是遍历每个元素并一次替换一个。

由于这些差异,如果您的 JavaScript DOM 代码使用这些类型的 on-the-fly DOM 更新,您将无法移植它"verbatim" 到 Python(使用相同的 DOM 调用)。但是,有时以这种不太动态的方式进行操作会更容易,因为脚下的事物变化较小。