我有300多个XML文件,如下所示:
<SUBJECT>
<TITLE>Mathematics</TITLE>
<AREA>
<TITLE>Geometry</TITLE>
<SECTION>
<TITLE>Coordinate Geometry</TITLE>
<TOPIC GRADELEVEL="10">
<TITLE>Plotting Ordered Pairs </TITLE>
// Lots of content
</TOPIC>
</SECTION>
</AREA>
</SUBJECT>
(eof)
应该这样读:
<SUBJECT>
<TITLE>Mathematics</TITLE>
</SUBJECT>
<AREA>
<TITLE>Geometry</TITLE>
</AREA>
<SECTION>
<TITLE>Coordinate Geometry</TITLE>
</SECTION>
<TOPIC GRADELEVEL="10">
<TITLE>Plotting Ordered Pairs </TITLE>
</TOPIC>
// Lots of content
是否存在批量解决方案以纠正此问题?
答案 0 :(得分:0)
最简单的方法是使用XSLT处理器(如Linux的xsltproc
)。您必须使用root
元素包围输入XML,以使XML有效
然后使用此XSLT-1.0文件(theAbove.xslt
)来转换XML。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="text()" />
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="SUBJECT | AREA | SECTION | TOPIC">
<xsl:copy>
<xsl:copy-of select="@*" />
<xsl:copy-of select="TITLE" />
</xsl:copy>
<xsl:apply-templates />
</xsl:template>
</xsl:stylesheet>
<强>输出:强>
<SUBJECT>
<TITLE>Mathematics</TITLE>
</SUBJECT>
<AREA>
<TITLE>Geometry</TITLE>
</AREA>
<SECTION>
<TITLE>Coordinate Geometry</TITLE>
</SECTION>
<TOPIC GRADELEVEL="10">
<TITLE>Plotting Ordered Pairs </TITLE>
</TOPIC>
用
调用它xsltproc theAbove.xslt yourSource.xml
答案 1 :(得分:0)
Saxon XSLT处理器允许您在输入行上指定包含源文档的目录:
java net.sf.saxon.Transform -t -s:inputdir -o:outputdir -xsl:theAbove.xslt
其优点是所有初始化成本(如编译样式表)仅产生一次。
答案 2 :(得分:0)
可以使用两个Perl正则表达式替换,第二个使用标记组和反向引用,以重新格式化XML文件的标题区域
<SUBJECT>
<TITLE>Mathematics</TITLE>
<AREA>
<TITLE>Geometry</TITLE>
<SECTION>
<TITLE>Coordinate Geometry</TITLE>
<TOPIC GRADELEVEL="10">
<TITLE>Plotting Ordered Pairs </TITLE>
// Lots of content
</TOPIC>
</SECTION>
</AREA>
</SUBJECT>
到
<SUBJECT>
<TITLE>Mathematics</TITLE>
</SUBJECT>
<AREA>
<TITLE>Geometry</TITLE>
</AREA>
<SECTION>
<TITLE>Coordinate Geometry</TITLE>
</SECTION>
<TOPIC GRADELEVEL="10">
<TITLE>Plotting Ordered Pairs </TITLE>
</TOPIC>
// Lots of content
因此,带有大量内容的块不会缩进,但是在包含* .xml文件的目录中运行此批处理文件时,其他行也是如此。 Windows命令解释程序cmd.exe
不支持在文本文件中替换Perl正则表达式。出于这个原因需要另外JREPL.BAT由 Dave Benham 编写,这是一个批处理文件/ JScript混合,用于使用正则表达式替换重新格式化XML文件中的行。 JREPL.BAT 必须与此批处理文件位于同一目录中。
@echo off
if not exist *.xml goto :EOF
if not exist "%~dp0jrepl.bat" goto :EOF
for /F "delims=" %%I in ('dir *.xml /A-D /B') do (
call "%~dp0jrepl.bat" "^[\t ]*</(?:AREA|SECTION|SUBJECT|TOPIC)>[\t ]*\r?\n" "" /M /F "%%I" /O -
call "%~dp0jrepl.bat" "^[\t ]*<(AREA|SECTION|SUBJECT|TOPIC)(.*>)[\t ]*(\r?\n)[\t ]*(<TITLE>.*</TITLE>)[\t ]*$" "<$1$2$3 $4$3</$1>" /M /F "%%I" /O -
)
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
call /?
dir /?
echo /?
for /?
goto /?
if /?
jrepl.bat /?