首页 > 解决方案 > 使用 xml 并导出节点名称

问题描述

我在下面写了这段代码。在我的 XML 文件中,我有节点:

Assembly_1, Detail_1, Detail_2, Assembly_2, Detail_3

我要做的是获取每个细节的程序集名称(Detail_1 和 2 将在 Assembly_1 中,等等)

我有很多细节......超过 200 个。所以这段代码(函数)运行良好,但需要很长时间,因为每次都会加载 XML 文件。

我怎样才能让它运行得更快?

def CorrectAssembly(detail):

    from xml.dom import minidom

    xml_path = r"C:\Users\vblagoje\test_python_s2k\Load_Independent_Results\HSB53111-01-D_2008_v2-Final-Test-Cases_All_1.1.xml"
    mydoc=minidom.parse(xml_path)
    root = mydoc.getElementsByTagName("FEST2000")
    assembly=""

    for node in root:
        for childNodes in node.childNodes:
            if childNodes.nodeType == childNodes.TEXT_NODE: continue

            if childNodes.nodeName == "ASSEMBLY":
                assembly = childNodes.getAttribute("NAME")
            if childNodes.nodeName == "DETAIL":
                if detail == childNodes.getAttribute("NAME"):
                    break

    return assembly

标签: pythonxml

解决方案


一种解决方案是,在查找所有详细信息之前简单地读取 XML 文件一次。
沿着这个:

from xml.dom import minidom


def CorrectAssembly(detail, root):

    assembly=""

    for node in root:
        for childNodes in node.childNodes:
            if childNodes.nodeType == childNodes.TEXT_NODE: continue

            if childNodes.nodeName == "ASSEMBLY":
                assembly = childNodes.getAttribute("NAME")
            if childNodes.nodeName == "DETAIL":
                if detail == childNodes.getAttribute("NAME"):
                    break

    return assembly


xml_path = r"C:\Users\vblagoje\test_python_s2k\Load_Independent_Results\HSB53111-01-D_2008_v2-Final-Test-Cases_All_1.1.xml"
mydoc=minidom.parse(xml_path)
root = mydoc.getElementsByTagName("FEST2000")

aDetail = "myDetail"
assembly = CorrectAssembly(aDetail, root)
anotherDetail = "myDetail2"
assembly = CorrectAssembly(anotherDetail , root)
# an so on

不过,每次调用该函数时,您仍然会浏览(部分)加载的 XML。也许创建一个将程序集映射到详细信息的字典,然后在需要时简单地查找它们是有益的:

from xml.dom import minidom

# read the xml
xml_path = r"C:\Users\vblagoje\test_python_s2k\Load_Independent_Results\HSB53111-01-D_2008_v2-Final-Test-Cases_All_1.1.xml"
mydoc=minidom.parse(xml_path)
root = mydoc.getElementsByTagName("FEST2000")

detail_assembly_map = {}

# fill the dictionary
for node in root:
    for childNodes in node.childNodes:
        if childNodes.nodeType == childNodes.TEXT_NODE: continue
        if childNodes.nodeName == "ASSEMBLY":
            assembly = childNodes.getAttribute("NAME")
        if childNodes.nodeName == "DETAIL":
            detail_assembly_map[childNodes.getAttribute("NAME")] = assembly

# use it
aDetail = "myDetail"
assembly = detail_assembly_map[aDetail]

从您的帖子中并不清楚 XML 的结构是如何的,但如果细节组件的子级,则可以通过首先迭代组件结并在其中通过其detail-children以不同的方式完成映射。那么你就不会依赖元素的正确排序。

这篇文章也可能会有所帮助,具体取决于您的 XML 树的结构。


推荐阅读