首页 > 解决方案 > 如何更改 xml 文件的结构格式?

问题描述

我有大量的 xml 文件,我想稍微改变一下它的格式。我怎样才能做到这一点?

这是我的问题:例如,我有以下内容:

<annotation>
<folder>New1</folder>
<filename>0000065.jpg</filename>
<path>C:\Users\farshad\Desktop\New1\0000065.jpg</path>
<source>
    <database>Unknown</database>
</source>
<size>
    <width>710</width>
    <height>287</height>
    <depth>3</depth>
</size>
<segmented>0</segmented>
<object>
    <name>car</name>
    <pose>Unspecified</pose>
    <truncated>0</truncated>
    <difficult>0</difficult>
    <bndbox>
        <xmin>132</xmin>
        <ymin>47</ymin>
        <xmax>574</xmax>
        <ymax>283</ymax>
    </bndbox>
</object>
</annotation>

我想将其更改为以下格式:

<annotation>
<folder>New1</folder>
<filename>0000065.jpg</filename>
<source>
<database>OXFORD-IIIT Pet Dataset</database>
<annotation>OXIIIT</annotation>
<image>flickr</image>
</source>
<size>
    <width>710</width>
    <height>287</height>
    <depth>3</depth>
</size>
<segmented>0</segmented>
<object>
    <name>car</name>
    <pose>Unspecified</pose>
    <truncated>0</truncated>
    <occluded>0</occluded>
    <bndbox>
        <xmin>132</xmin>
        <ymin>47</ymin>
        <xmax>574</xmax>
        <ymax>283</ymax>
    </bndbox>
    <difficult>0</difficult>
</object>
</annotation>

非常感谢您的任何推荐。

标签: xmldata-conversion

解决方案


这种转换的常用方法是使用 XSLT。我不会为您编写代码,并且我不建议在没有先阅读该语言的基本概念的情况下使用 XSLT,但在大纲中:

定义一个处理注解元素的规则,它使用相关规则处理它的所有子元素:

<xsl:template match="annotation">
  <xsl:copy>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

定义处理注解子节点的默认规则,即原样复制它们:

<xsl:template match="annotation/*">
  <xsl:copy-of select="."/>
</xsl:template>

定义删除<path>元素的规则:

<xsl:template match="path"/>

定义转换<source>元素的规则。我不知道您对此的逻辑是什么,所以我将其未完成:

<xsl:template match="source">
   ...
</xsl:template>

有多种 XSLT 处理器可供选择。其中许多(包括 Python 的默认处理器)仅支持 XSLT 1.0,这对于像这样的简单转换来说已经足够了。稍后您会遇到需要 XSLT 2.0 或 3.0 的更复杂的转换,因此您可能希望从具有该功能的处理器开始。


推荐阅读