Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用xml和导出节点名称_Python_Xml - Fatal编程技术网

Python 使用xml和导出节点名称

Python 使用xml和导出节点名称,python,xml,Python,Xml,我在下面写了这段代码。在我的XML文件中,我有以下节点: Assembly_1, Detail_1, Detail_2, Assembly_2, Detail_3 我试图做的是为每个细节获取组件的名称(细节1和2将在组件1中,等等) 我有很多细节。。。200多人。因此,此代码(函数)运行良好,但需要花费大量时间,因为每次都会加载XML文件 我怎样才能让它跑得更快 def校正组件(详图): 从xml.dom导入minidom xml\u path=r“C:\Users\vblagoje\test

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

Assembly_1, Detail_1, Detail_2, Assembly_2, Detail_3
我试图做的是为每个细节获取组件的名称(细节1和2将在组件1中,等等)

我有很多细节。。。200多人。因此,此代码(函数)运行良好,但需要花费大量时间,因为每次都会加载XML文件

我怎样才能让它跑得更快

def校正组件(详图): 从xml.dom导入minidom xml\u path=r“C:\Users\vblagoje\test\u python\u s2k\Load\u Independent\u Results\HSB53111-01-D\u 2008\u v2-Final-test-Cases\u All\u 1.1.xml” mydoc=minidom.parse(xml\u路径) root=mydoc.getElementsByTagName(“FEST2000”) assembly=“” 对于根目录中的节点: 对于node.childNodes中的childNodes: 如果childNodes.nodeType==childNodes.TEXT\u节点:继续 如果childNodes.nodeName==“程序集”: assembly=childNodes.getAttribute(“名称”) 如果childNodes.nodeName==“详细信息”: 如果detail==childNodes.getAttribute(“名称”): 打破 返回组件
一种解决方案是,在查找所有详细信息之前只需读取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的结构是如何的,但是如果细节是程序集的子项,那么映射可以通过首先遍历程序集节点并在其中遍历其细节子项来完成。那么您就不会依赖于元素的正确顺序

post也会有所帮助,具体取决于XML树的结构