原文地址: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转换器
3、
在XMLTemplater之后连接Logger转换器,并运行
注意,模板通过_result字段简单地输出。
我们真正需要的是,在输出XML之前,将CSV的值合并到模板中。为了实现该功能,我们只需要打开XMLTemplater转换器,编辑ROOT,点击我们想要插入值的位置,然后点击我们想要获取的属性值。此过程只需将属性函数和我们选择的属性({fme:get-attribute (“Building_id”)} etc)插入到模板中即可。
一旦完成上述过程,你会得到如下的根模板:
将目标数据集的路径设置为building_output.xml,然后设置输出的MIME type为text/xml。MIME type的选择对在一些阅读器,比如web浏览器,中正确显示XML是非常重要的。为了向文本写模块提供参数值,将XMLTemplater的“Result attribute”设置为“text_line_data“。
5、
运行工作空间,检查building_output.xml的输出结果
练习 1.b 基本的XML输出---多条记录
接下来的练习展示如何使用XMLTemplater的子模板将输入的多条记录添加成子元素。
2、
然后,编辑XMLTemplater
在Sub Templates处打勾,点击“+”添加新的子模板。
编辑完成后,点击OK保存所做的改变。你会看到XMLTemplater出现一个新的输入端口“SUB”。我们需要将读入的Room要素连接到此端口,以便获取我们需要的字段。
现在,Room要素已经连接,我们可以用读入的CSV值替换上面的这些值。然后产生一个子模板,如下:
为了完成XMLTemplater的配置,我们需要在根模板中调用子模板。该过程可以通过使用fme:processing-feature(“SUB”)来完成。将此语句添加到你的根模板中,那么,Room子元素就被插入到Building父对象的末尾:
3、
在XMLTemplater后面添加XML Formatter转换器
在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元素后: