![](/img/trans.png)
[英]parse xml files in subdirectories using beautifulsoup in python
[英]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 中发现了一些问题
例如:来源:
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.