批量修正格式不正确的XML文件

时间:2018-02-03 18:04:01

标签: xml batch-file

我有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

是否存在批量解决方案以纠正此问题?

3 个答案:

答案 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 /?