python - 使用 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
解决方案
一种解决方案是,在查找所有详细信息之前简单地读取 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 树的结构。
推荐阅读
- python-3.x - 如何在 pygame 中读取、写入和更新您的游戏高分 from/to file.txt saved.?
- python - Python类方法继承
- java - 如何修复 int Bitmap getWidth() 的空引用错误
- html - 是否可以使用 :hover 更改图像?
- ruby-on-rails - 如何在 embeds_many mongoid rails 应用程序中按嵌入式模型字段排序?
- reactjs - 使用 BrowserRouter 响应 js:当我部署到 apache 服务器时它是空白的
- python - Altair 等值线图,基于折线图选择的颜色高亮
- ios - m4a 文件使用 avplayer 播放,但不使用 avaudioplayer
- django - Django一父二子关系
- python - 如何检查 Python 的用户定义函数天气传递给它的列表 [] 只包含整数?