在平面xml文件中创建结构

Dav*_*ano 1 python xml

我有一个像这样的xml文件:

<car>Ferrari</car>
<color>red</color>
<speed>300</speed>
<car>Porsche</car>
<color>black</color>
<speed>310</speed>
Run Code Online (Sandbox Code Playgroud)

我需要以这种形式:

<car name="Ferrari">
    <color>red</color>
    <speed>300</speed>
</car>
<car name="Porsche">
    <color>black</color>
    <speed>310</speed>
</car>
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?我正在努力,因为我想不出一种方法来创建我需要的结构,从原始xml文件中的平面标签lis.

我选择的语言是Python,但欢迎提出任何建议.

Tom*_*lak 7

XSLT是将一个XML结构转换为另一个XML结构的完美工具.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <!-- copy the root element and handle its <car> children -->
  <xsl:template match="/root">
    <xsl:copy>
      <xsl:apply-templates select="car" />
    <xsl:copy>
  </xsl:template>

  <!-- car elements become a container for their properties -->
  <xsl:template match="car">
    <car name="{normalize-space()}">
      <!-- ** see 1) -->
      <xsl:copy-of select="following-sibling::color[1]" />
      <xsl:copy-of select="following-sibling::speed[1]" />
    </car>
  </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

1)对于这个工作,你的XML必须有一个<color><speed>每一个<car>.如果不能保证,或者数量和类型的属性通常是可变的,请用复制语句的通用形式替换这两行:

<!-- any following-sibling element that "belongs" to the same <car> -->
<xsl:copy-of select="following-sibling::*[
  generate-id(preceding-sibling::car[1]) = generate-id(current())
]" />
Run Code Online (Sandbox Code Playgroud)

应用于您的XML(我暗示了一个名为的文档元素<root>),这将是结果

<root>
  <car name="Ferrari">
    <color>red</color>
    <speed>300</speed>
  </car>
  <car name="Porsche">
    <color>black</color>
    <speed>310</speed>
  </car>
</root>
Run Code Online (Sandbox Code Playgroud)

在Python中将XSLT应用于XML的示例代码应该很容易找到,所以我在这里省略.它只需要4到5行Python代码.