更正xml文件格式并将其应用于文件夹和子文件夹中的所有xml文件

时间:2015-02-15 14:38:53

标签: xml

我有大约800个带有formt的xml文件,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<playlist version="1" xmlns = "http://xspf.org/ns/0/">
<trackList><track>
  <location>../ppa/1/50/01 - Taknavazi.111</location>
  <title>Taknavazi</title>
  <creator>1</creator>
    <image>../images/Albumssmall70/Eshgh danad70.jpg</image>
</track><track>
  <location>../ppa/1/50/02 - Saz-o-Avaz - Daramad AbuAta.111</location>
  <title>Sazo avaz-Darama abouatta</title>
  <creator>2</creator>
    <image>../images/Albumssmall70/Eshgh danad70.jpg</image>
</track><track>
  <location>../ppa/1/50/03 - Saz-o-Avaz - Hejaz-JameDaran-   Hejaz.111</location>
  <title>Sazo avaz-Hejaz-jamehdaran-hejaz</title>
  <creator>3</creator>
    <image>../images/Albumssmall70/Eshgh danad70.jpg</image>
</track><track>
  <location>../ppa/1/50/04 - Saz-o-Avaz - KordBayat-Ouj-Esfahanak-Forod.111</location>
  <title>Sazo avaz-bayate kord-ooj-esfahanak-foroud</title>
  <creator>4</creator>
    <image>../images/Albumssmall70/Eshgh danad70.jpg</image>
</track><track>
  <location>../ppa/1/50/05 - Saz-o-Avaz - Dashtestani-KhosroShirin-Dashtestaniat.111</location>
  <title>Sazo avaz-dashtestani-khosroo va shirin-dashtestaniyat</title>
  <creator>5</creator>
    <image>../images/Albumssmall70/Eshgh danad70.jpg</image>
</track><track>
  <location>../ppa/1/50/06 - Tasnif - Bahare Delkash.111</location>
  <title>Tasnif- bahare delkash</title>
  <creator>6</creator>
    <image>../images/Albumssmall70/Eshgh danad70.jpg</image>
</track></trackList>

我想改变它的格式:

<?xml version="1.0" encoding="UTF-8"?>
<playlist version="1" xmlns = "http://xspf.org/ns/0/">

<item>
  <file>../ppa/1/50/01 - Taknavazi.mp3</file>
  <title>Taknavazi</title>
  <image>../images/Albumssmall70/Eshgh danad70.jpg</image>
</item>
<item>
  <file>../ppa/1/50/02 - Saz-o-Avaz - Daramad AbuAta.mp3</file>
  <title>Sazo avaz-Darama abouatta</title>
  <image>../images/Albumssmall70/Eshgh danad70.jpg</image>
</item>
<item>
  <file>../ppa/1/50/03 - Saz-o-Avaz - Hejaz-JameDaran-Hejaz.mp3</file>
  <title>Sazo avaz-Hejaz-jamehdaran-hejaz</title>
  <image>../images/Albumssmall70/Eshgh danad70.jpg</image>
</item>
<item>
  <file>../ppa/1/50/04 - Saz-o-Avaz - KordBayat-Ouj-Esfahanak-Forod.mp3</file>
  <title>Sazo avaz-bayate kord-ooj-esfahanak-foroud</title>
  <image>../images/Albumssmall70/Eshgh danad70.jpg</image>
</item>
<item>
  <file>../ppa/1/50/05 - Saz-o-Avaz - Dashtestani-KhosroShirin-Dashtestaniat.mp3</file>
  <title>Sazo avaz-dashtestani-khosroo va shirin-dashtestaniyat</title>
  <image>../images/Albumssmall70/Eshgh danad70.jpg</image>
</item>
<item>
  <file>../ppa/1/50/06 - Tasnif - Bahare Delkash.mp3</file>
  <title>Tasnif- bahare delkash</title>
  <image>../images/Albumssmall70/Eshgh danad70.jpg</image>
</item>

请告诉我有没有办法让我更正一个xml文件,然后将新格式应用到文件夹及其子文件夹中的所有其他xml文件? 提前致谢

2 个答案:

答案 0 :(得分:1)

我会使用XSLT

首先,您需要为格式之间的转换创建样式表:

transform.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:pl="http://xspf.org/ns/0/"
    exclude-result-prefixes="pl"
>
  <xsl:template match="/">
  <playlist version="1" xmlns="http://xspf.org/ns/0/">
    <xsl:for-each select="//pl:track">
      <item>
        <file><xsl:value-of select="pl:location"/>.mp3</file>
        <xsl:copy-of select="pl:title" />
        <image><xsl:value-of select="pl:image"/></image>
      </item>
    </xsl:for-each>
  </playlist>
  </xsl:template>
</xsl:stylesheet>

请注意,我已经注册了名称空间pl来寻址源xmls名称空间的元素。为了避免pl命名空间包含在输出xmls中,我正在使用exclude-result-prefixes="pl"

现在您可以测试单个文件的转换。我正在使用您可能需要先安装的xsltprocxmllint。在Debian / Ubuntu上你需要执行

sudo apt-get install xmllint

对于测试转换,请使用以下命令(请注意,我使用xmllint进行格式化)

xsltproc transform.xml file123.xml | xmllint --pretty 1 -

你应该得到问题中描述的结果xml。如果要将其保存到文件中,只需在shell中使用输出重定向:

xsltproc transform.xml file123.xml | xmllint --pretty 1 - > output.xml

要一次转换所有输入xmls,您需要编写一个小shell脚本。假设输入文件位于input,输出文件应存储在output

for file in input/*.xml ; do
    output_path="output/$(basename \"$file\")"
    xsltproc test.xsl "$file" \
        | xmllint --pretty 1 - > "$output_path"
done

答案 1 :(得分:1)

Saxon XSLT处理器的URI解析器提供了打开多个XML文件的功能:

<xsl:variable name="all"
              select="collection('./?select="*.xml;recurse=yes;on-error=ignore')"/>

然后,您可以浏览所有文档,为每个文档打开一个新结果:

<xsl:for-each select="$all">
  <xsl:result-document href="...determine output URI here...">
    <xsl:apply-templates... (or whatever)/>
  </xsl:result-document>
</xsl:for-each>