使用XMLTemplater写出XML

原文发布时间:2016-12-07

翻译文章地址:https://knowledge.safe.com/articles/30940/xml-writing-with-xmltemplater.html

介绍
        XML是一种结构化的文本形式,常用于开放标准和交换格式。也常出现在Web和消息传递应用程序中。将数据转换成XML格式是FME的一项重要功能。本文介绍编写XML的FME方法,并且以基本的示例帮助你快速入门。假设你已了解一些基本的FME和XML概念。比如,XML中的术语“element”可能涉及FME中的要素或属性,这取决于如何解析XML文档。查看 XML的FME方法获取更多背景信息。
        FME使用模板的方法编写XML。将XML的文档结构放置在XMLTemplater转换器中,或通过XMLTemplater转换器引用。然后通过fme:get-attribute函数将你需要的属性值加入文档。这个函数非常像邮件合并操作,能够从每条记录接收名字和地址,放入书信模板,动态生成自定义的消息。
       每个要素都能生成一个XML文档。或者是一个根模板和子模板,能够模拟基于多记录数据集的、包含多个子元素的根元素的文档。能够使用XMLSampleGenerator转换器从XSD生成XML文档的结构,或者从示例XML获取结构。通过XMLTemplater生成的XML保存在_result属性中,我们可以使用XMLValidator和XMLFormatter转换器分别验证和格式化它。下面的例子中,我们使用示例XML作为模板的种子,然后将验证和格式化留到下一个练习。
       通常,最终的输出使用Text File写模块写入磁盘,因为XML的结果属性只是一个大的文本字段。XML写模块并不经常使用,因为它还不支持从XSD读取结构(schema)。在特殊情况下,XML写模块是有益的,比如使用碎片模式写出大数据量的XML数据集。这种优化的方法允许XML碎片在接收时就被写出,而不是像Text File写模块一样,事先建立整个文档的缓冲区,然后输出。

练习 1.a 基本的XML输出---一条记录
接下来的例子展示如何将一条记录送入XMLTemplater的模板,并生成一个与Safe_Building_Demo.xml的结构匹配的基本的XML文档。

1、 打开FME工作空间
        打开空白的工作空间,拖放附件中的源CSV文件:building.scv。

2、 添加XMLTemplater转换器
        转换的第一步是生成根元素。为了创建XML模板,我们从XML示例文件的根对象处复制内容,以生成我们需要的XML文件——在这个例子中,根元素来自Safe_Building_Demo.xml。
添加XMLTemplater转换器,将CSV的建筑要素类(building)连接到它,编辑XMLTemplater,然后将下述内容放入ROOT模板中:

        

3、 在XMLTemplater之后连接Logger转换器,并运行
        注意,模板通过_result字段简单地输出。
        我们真正需要的是,在输出XML之前,将CSV的值合并到模板中。为了实现该功能,我们只需要打开XMLTemplater转换器,编辑ROOT,点击我们想要插入值的位置,然后点击我们想要获取的属性值。此过程只需将属性函数和我们选择的属性({fme:get-attribute (“Building_id”)} etc)插入到模板中即可。
一旦完成上述过程,你会得到如下的根模板:

        

4、 最后,为了将结果写入硬盘,从写模块菜单中,添加一个Text File写模块
       将目标数据集的路径设置为building_output.xml,然后设置输出的MIME type为text/xml。MIME type的选择对在一些阅读器,比如web浏览器,中正确显示XML是非常重要的。为了向文本写模块提供参数值,将XMLTemplater的“Result attribute”设置为“text_line_data“。

5、 运行工作空间,检查building_output.xml的输出结果
         查看这些值是如何合并到XML文档结构内的。你会看到下列输出。注意fme:get-attribute (“”)函数是如何被要素的属性值所替代:
 

        

练习 1.b 基本的XML输出---多条记录
        接下来的练习展示如何使用XMLTemplater的子模板将输入的多条记录添加成子元素。
        回到原始任务,我们想要使用FME生成XML内容,该内容与Safe_Building_Demo.xml的结构匹配。我们已经在例1.a中生成了根元素内容,所以,接下来的步骤就是生成Room元素。

1、 首先,添加新的CSV读模块,读取Rooms.csv文件。
2、 然后,编辑XMLTemplater
在Sub Templates处打勾,点击“+”添加新的子模板。

        

如前,我们从一个简单的示例或想要生成的对象元素着手,完成模板。在这里,我们也给出一个Room元素的例子,该Room元素从Safe_Builiding_Demo.xml的第一个房间获取:


编辑完成后,点击OK保存所做的改变。你会看到XMLTemplater出现一个新的输入端口“SUB”。我们需要将读入的Room要素连接到此端口,以便获取我们需要的字段。
        现在,Room要素已经连接,我们可以用读入的CSV值替换上面的这些值。然后产生一个子模板,如下:

        为了完成XMLTemplater的配置,我们需要在根模板中调用子模板。该过程可以通过使用fme:processing-feature(“SUB”)来完成。将此语句添加到你的根模板中,那么,Room子元素就被插入到Building父对象的末尾:


3、 在XMLTemplater后面添加XML Formatter转换器
        最后,在写入硬盘之前,最好格式化一下xml文件。这使得检验输出的xml文件和排除故障变得更加简单,顺便还可以捕捉语法错误,因为只有有效的XML才可以格式化。后面我们会详述检证。
在XMLTemplater之后添加XMLFormatter转换器。设置“Attribute with XML text”和“Attribute to contain XML output”为“text_line_data”。剩余的设置保持默认值(Formatting type应为“Pretty-Print XML”)。

4、 将XMLFormatter的输出连接到text_line要素类。
运行工作空间。你的输出如下所示。注意,多个Room元素被插入到Building对象的Location元素后:

注意,XMLTemplater的输入要素包含作为根元素的Building元素,以及3个作为子元素的Room元素,最终输出一个要素,为合并的XML文档。


猜你喜欢

转载自blog.csdn.net/fmechina/article/details/80849874