XML 转换为其他 XML

Posted

技术标签:

【中文标题】XML 转换为其他 XML【英文标题】:XML transform to other XML 【发布时间】:2021-01-18 05:21:04 【问题描述】:

每天我都需要将格式从 XML(A) 转换为 XML(B) 并将新的 XML 保存在服务器上。如何最好地存档?

想法是:

使用 php 提取 XML(A) 并保存到 mysql 数据库。打印出新的 XML(B)。 使用 PHP 加载 XML(A) 并转换为 XML(B)

有人可以展示将 XML 标记转换为另一个标记或属性的示例吗?

这里是 XML (A)

<?xml version="1.0" encoding="UTF-8"?>
<EventList><!--Movie description-->
   <listmovies>
      <Movie No="9111">
         <Name>filmtitle</Name>
         <Imagepath>imagepic1.jpg</Imagepath>
         <Synopsis>Cowboy og Indianer planlægger en surprise fødselsdagsfest for Hest, men ender ud i store
                problemer da de bestiller 50 mio. mursten til barbecuegrillen, i stedet for 50. Det bliver starten på en forunderlig rejse hvor trioen rejser til Jordens midte. Kilde: Angel Distribution
      </Synopsis>
      </Movie>
   </listmovies>
   <!--Event description-->
   <Event No="0003" MovieNo="9111">
      <Period>
         <Start Date="153677" Time="44400">2020-10-02T12:20:00+02:00</Start>
      </Period>
   </Event>
</EventList>

要达到的结果。 XML (B)

<?xml version="1.0" encoding="UTF-8"?>
<!-- Movie description -->
<FluxAgenda>
   <Film id="9111"
         titre="filmtitle"
         resume="Cowboy og Indianer planlægger en surprise fødselsdagsfest for Hest, men ender ud i store problemer da de bestiller 50 mio. mursten til barbecuegrillen, i stedet for 50. Det bliver starten på en forunderlig rejse hvor trioen rejser til Jordens midte. Kilde: Angel Distribution"/>
   <!-- Event description -->
   <EvenementSimple id="0003" dateFin="153677">
      <Horaires>
         <Date date="2020-10-02" heure="12:20"/>
      </Horaires>
   </EvenementSimple>
   <Affiches>
      <Photo url="imagepic1.jpg" filmId="9111"/>
   </Affiches>
</FluxAgenda>

【问题讨论】:

非常感谢,这项工作。 一个后续问题 @Parfait 如果我在父节点中有多个子节点怎么办? &lt;Event No="0003" MovieNo="9111"&gt;&lt;Period&gt;.....&lt;/Period&gt;&lt;Period&gt;.....&lt;/Period&gt;&lt;Period&gt;.....&lt;/Period&gt;&lt;/Event&gt; 再一次,请在已发布的答案(不是我的评论)下回复@Sebastien 的answer 而不是我。 【参考方案1】:

您可以对输入 XML 使用简单的 XSLT 转换来获得所需的输出:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="EventList">
    <FluxAgenda>
        <xsl:apply-templates select="listmovies/Movie"/>
        <xsl:apply-templates select="Event"/>
        <xsl:apply-templates select="listmovies/Movie/Imagepath"/>
    </FluxAgenda>
  </xsl:template>
  
  <xsl:template match="Movie">
      <Film id="@No" titre="Name" resume="Synopsis"/>
  </xsl:template>
  
  <xsl:template match="Event">
      <EvenementSimple id="@No" dateFin="Period/Start/@Date">
          <Horaires>
            <xsl:apply-templates select="Period"/>
          </Horaires>
      </EvenementSimple>
  </xsl:template>
  
  <xsl:template match="Period">
        <Date date="substring(Start,1,10)" heure="substring(Start,12,5)"/>
  </xsl:template>
  
  <xsl:template match="Imagepath">
      <Affiches>
          <Photo url="." filmId="../../Movie/@No"/>
      </Affiches>
  </xsl:template>
  
</xsl:stylesheet>

在这里查看它的工作原理:https://xsltfiddle.liberty-development.net/aixRuu/25

【讨论】:

PHP 可以运行带有 XSL 模块的 XSLT 1.0 脚本:php.net/manual/en/xsltprocessor.transformtoxml.php 谢谢,我会调查的! 如果我在一个父节点中有多个子节点怎么办??? &lt;Event No="0003" MovieNo="9111"&gt;&lt;Period&gt;.....&lt;/Period&gt;&lt;Period&gt;.....&lt;/Period&gt;&lt;Period&gt;.....&lt;/Period&gt;&lt;/Event&gt; 非常感谢,它帮助了 :)

以上是关于XML 转换为其他 XML的主要内容,如果未能解决你的问题,请参考以下文章

将具有混合复杂类型元素的 XML 转换为 DataSet,以及其他 DataSet 限制

将 XML 转换为 X12 和 X12 转换为 XML 的最佳方法

如何将资产文件转换为 XML 文件

使用 T-SQL 将表转换为 XML

JavaEE XML XSL转换(XSLT)

如何将base64的文本文件转换为xml文件(或任何其他类型的文件)