【问题标题】:Using python lxlm to Parse multiple xml files in multiple subdirectories使用python lxlm解析多个子目录下的多个xml文件
【发布时间】:2021-05-19 16:12:46
【问题描述】:

我在多个子目录中有多个大型 xml 文件。我正在尝试整理所有 xml 文件中的 uuid。

这里是 uuid.xslt 文件

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="uuids">
    <xsl:copy>
        <xsl:apply-templates select="uuid">
            <xsl:sort select="."/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

<xsl:template match="groups">
    <xsl:copy>
        <xsl:apply-templates select="groupUuid">
            <xsl:sort select="."/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

<xsl:template match="history">
    <xsl:copy>
        <xsl:apply-templates select="historyInfo">
            <xsl:sort select="@versionUuid"/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>

这里是 python 代码,我可以打印所有目录和子目录中的所有 .xml 文件,并解析它们。我需要为新的输出路径创建相同的目录结构

iimport os
import lxml.etree as ET

inputpath = "C:\\projects\\test\\uuid\\"
xsltfile = "C:\\projects\\test\\uuid\\uuid.xslt"
outpath = "C:\\projects\\test\\output"

dir = []

for dirpath, dirnames, filenames in os.walk(inputpath):
    structure = os.path.join(outpath, dirpath[len(inputpath):])
    if not os.path.isdir(structure):
        os.mkdir(structure)
    for filename in filenames:
        if filename.endswith(('.xml')):
            dir = os.path.join(dirpath, filename)
            print(dir)
            dom = ET.parse(dir)
            xslt = ET.parse(xsltfile)
            transform = ET.XSLT(xslt)
            newdom = transform(dom)
            outfile = open(outpath + "\\" + filename, 'a')
            outfile.write(ET.tostring(newdom,pretty_print=True).decode())

我在输出中发现了一些问题

  1. 目标输出文件应存储在与源相同的目录结构中。我能够创建相同的目录结构,但我无法将文件传递到相同的目录,所有文件都仅存储在根位置。

例如: 来源:

C:\projects\xmlformat\uuid\new.xml C:\projects\xmlformat\uuid\patches.xml C:\projects\xmlformat\uuid\application_a-0000e2csv-22c6-8000-9ba2-011c48011c48_72930.xml C:\projects\xmlformat\uuid\application_a-0000e2ff-22c6-8000-9ba2-011c48011c48_97397.xml

目标应如下创建

C:\projects\test\output\new.xml C:\projects\test\output\patches.xml C:\projects\test\output\application_a-0000e2csv-22c6-8000-9ba2-011c48011c48_72930.xml C:\projects\test\output\application_a-0000e2ff-22c6-8000-9ba2-011c48011c48_97397.xml

提前致谢

【问题讨论】:

    标签: python xml parsing lxml


    【解决方案1】:

    问题出在ET.parse('f')。当您输入parse 一个字符串时,它会尝试使用该字符串作为文件路径打开一个文件,因此它实际上是在工作目录中寻找一个名为“f”的文件。

    你想要这样的东西:

    for f in files:
         ...
         xmlfile  = ET.parse(f)
    

    【讨论】:

    • 您好,感谢您的回复。是的,我发现了这个问题。您能否再次检查问题并提出您对此问题的任何想法?
    【解决方案2】:

    我已经解决了,这是运行正常的python代码

    import os
    import lxml.etree as ET
    
    inputpath = "C:\\projects\\test\\uuid\\"
    xsltfile = "C:\\projects\\test\\uuid\\uuid.xslt"
    outpath = "C:\\projects\\test\\output"
    
    dir = []
    
    for dirpath, dirnames, filenames in os.walk(inputpath):
        structure = os.path.join(outpath, dirpath[len(inputpath):])
        if not os.path.isdir(structure):
            os.mkdir(structure)
        for filename in filenames:
            if filename.endswith(('.xml')):
                dir = os.path.join(dirpath, filename)
                print(dir)
                dom = ET.parse(dir)
                xslt = ET.parse(xsltfile)
                transform = ET.XSLT(xslt)
                newdom = transform(dom)
                outfile = open(structure + "\\" + filename, 'a')
                outfile.write(ET.tostring(newdom,pretty_print=True).decode())
    

    【讨论】:

      猜你喜欢
      • 2020-06-07
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      相关资源
      最近更新 更多