繁体   English   中英

使用python lxlm解析多个子目录下的多个xml文件

[英]Using python lxlm to Parse multiple xml files in multiple subdirectories

我在多个子目录中有多个大型 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 文件,并解析它们。 我需要为新的 output 路径创建相同的目录结构

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())

我在 output 中发现了一些问题

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

例如:来源:

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

提前致谢

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

你想要这样的东西:

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

我解决了,这是运行正常的 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())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM