FME 2012专有的新增转换器——第二讲

原文发布时间:2012-06-06

《FME 2012专有的新增转换器——第一讲》地址:

https://blog.csdn.net/fmechina/article/details/80984801

翻译:小新

翻译原文地址:https://blog.safe.com/2012/05/fmeevangelist103/

问候FME的使用者们,

这是我承诺的关于2012新增转换器文章的第二部分。很抱歉它比计划的晚了一周,因为它撞上了我的 FME 世界之旅实况博客。

第一讲是关于AttributeExpressionRenamer,RasterToPolygonCoercer以及SilverRemover三个转换器。这部分将集中讲三个新的XML转换器:XMLFlattener,XMLSampleGenerator,和XMLUpdater。


XML因为难于理解并且使用起来比较复杂,由此得到一个不好的名声。奇怪的是它看起来非常简单和明显,实际却是一个难于理解和令人工作起来很痛苦的事情 。

但它只是在你没有使用正确的工具时才是一种痛苦:FME2012以友好的用户界面方式提供了有效的XML工具,即使对那些临时XML用户来说也如此。 

如果你不相信我,请看下面的内容:或者看看FME 世界巡回之旅 中的有关部分。就像Don说的“让你的XML闪耀吧”!


XMLFlattener

将XML与GIS(或其他的空间模型)一起使用的难点在于空间系统通常面向关系型或“平面化”(扁平化)的数据结构进行工作。而XML文档是面向对象并且通常是高度嵌套的数据结构。

因此,许多关于处理XML数据的难点在于:

·  读取XML文档并将它转换为GIS关系型数据结构

·   转换GIS关系型结构,并将它写为XML文档。

第一个难点是XMLFlattener 可以解决的问题。想象一个有不同层级和缩进标记的XML文档。在你的脑袋里把这个XML文档的画面向左旋转90度,然后想象一个大铁锤朝着它砸下来。

这就是XMLFlattener要做的事情,它砸向XML,直到你获得GIS数据结构那样的属性数据。


我们以“吞下苍蝇的老妇人”这个文档作为示例,也许你在很多FME有关演示中看到过这个示例。该示例是利用一系列输入要素(一只苍蝇,一只鸟,一只猫,一条狗等)创建XML文档,输出的结果是沿行生成的一个高度嵌套的XML文档:


然而,在我们这次演示中,我将做的是在FME中读取这个输出文档。我希望读取数据到一个平面化(扁平化)的结构中,因此我们需要使用XMLFlattener:


因此该工作空间用Textline读模块读取XML数据,并使用新选项(2012特有)将整个文件读取为一个单一的要素属性(通常是每行获取一个要素)。

接着使用XMLFlattener从XML属性(XML Attribute)中提取信息。输出结果像这样:


现在得到的是所有属性的组合。这里有一个列表,并且我知道有很多元素包含在这个列表中;事实上你可以看出这个老妇人吞下了很多个文件。

它们具有比较复杂的属性名称,但是我可以使用AttributeExpressionRenamer(参考 第一讲)自动的移除多个Horse/Cow/Dog这样的前缀。

但是,这样一个组合属性和列表的数据是很难处理的。我将重新打开扁平化选项(flatten options)— 使用高级模式(Advanced)— 编辑cardinality项。我要做的是移除“+”这个符号(你可以亲自试试,你就会明白是怎么一回事):


然后我重新运行工作空间,将得到如下的列表:


这个看起来好像仍然难于使用,但是由于数据已经完全暴露为一个列表,这样处理起来就容易多了。根据我将如何使用数据的情况,我可以使用ListExploder暴露整个列表并将它炸开为单个的要素,也可以使用一个自定义循环转换器单独研究每一个列表元素,或者我可以使用其他的列表转换器,如ListElementCounter找出每个老妇人吞下了多少个苍蝇。


好了,老妇人的例子显然是不会在真实世界中遇到的事情,但是如果你自己使用过XML数据,你就会知道这个例子中用到的数据结构是很真实的。


XMLSampleGenerator

XML文档不像其他格式那样具有内部模式定义。它们的模式通常是由一个以.xsd为扩展名的模式文件定义。XML模式可以让你了解使用的数据类型和验证XML路径名称。

因此,当读取XML(或GML)数据集时,FME可以使用模式文件来了解数据结构并建立工作空间的模式。如果没有模式文件,FME则不能解译出XMl/GML文档的内容所表达的意思,在读取数据时将报错。

ERROR |The XML format could not be determined by examination. Try entering a feature path into the “Elements to Match” parameter, specifying an xfMap, selecting an XRS, or using a more specific reader

但是上面提到的只是读取数据。当你想从头创建(写)一个XML文档时会发生什么呢?你可能知道所创建XML文档的结构应该是怎样的,因为你有一个xsd模式文档的副本。但你怎么把它转变为一个XML文档呢?使用 XMLSampleGenerator!

XMLSampleGenerator使用一个XML模式文件并根据它建立一个空的XML文档。这点对于XML来说是非常有益的事:你可以有一个没有数据的但是结构正确的XML空白文档。一旦你有了结构化的数据集,你就可以开始往该数据集里面填充信息。

以这个为例:

我想创建一个与数据集正确匹配的元数据文档。我已经下载了描述XML结构的xsd模式文件,并想根据这个模式文件创建元数据文档。

因此,首先我需要打开一个空白工作空间,增加一个XMLSampleGenerator转换器,并使用一个Creator转换器创建一个要素来触发XMLSampleGenerator。然后使用一个AttributeFileWriter转换器来输出新建的XML:


XMLSampleGenerator转换器中的参数设置如下:


这里我主要指定了XSD文件(这里是基于ISO 19139标准的)以及在输出XML中要包含的XSD数据的元素。我只选择了contact信息,仅仅是演示一下可以做什么。其他的参数可以让你控制是否包含可选的属性等。

当我运行工作空间,转换器生成的结果将写入到一个文件中,该文件看起来是这样的:


现在就创建了一个基本的XML文档,便可以往该文档中添加信息了。


XMLUpdater
      以前的一句话引出一个问题:如何对已有XML文档添加信息?答案是使用XMLUpdater。

XMLUpdater可以让你对XML文档中的路径/元素等内容进行添加,移除或编辑。它可以从一个文件中读取XML文档,或使用属性的内容,我们在这个例子中就要做这样的事情。


使用XMLSampleGenerator创建XML文档,在写出之前使用XMLUpdater。XMLUpdater将更新文档内容。更新内容可以为硬编码(就像我这里做的那样)或者通过UPDATE端口的要素中获取。

注意:你通常需要输入一个要素到UPDATE端口来触发更新,即使这个要素不带任何更新信息。

我多次因为这个而出现问题,所以我必须重复:如果你没有输入要素到UPDATE端口,XMLUpdater将不会进行任何操作。再一次重复,我只需要使用一个简单的Creator转换器的创建的空要素来触发即可。

XMLUpdater的参数像这样:


需要注意替换(replace)、更新(update)、插入(insert)和删除(delete)这些操作。我只是对数据进行更新,使它看起来是我需要的样子。我已经删除了不需要的字段,使用新的值对一些字段进行了更新,并且添加了我觉得可能有用的字段(如phone extension)。

路径(path)是从XML文档中得到的。回头看看在XMLUpdater和XMLSampleGenerator输出中的那些路径,并将它们进行比较,你会发现它们很匹配。现在我将运行这个工作空间,不过在这里我还将添加两个额外的XML转换器。它们是XMLFormatter和XMLValidator:


XMLFormatter可以让我美化打印XML的内容—主要通过删除多余的空格和对内容进行正确缩进,使文档的可读性更强。

XMLValidator可以将新的内容和原始模式进行比较,确保内容的结构正确并且具有正确的标签。在这里,验证可能会失败,因为我把数据弄得比较混乱(例如,增加了一个新的字段)。因此这里我将只验证语法(syntax)而不是模式(schema)。

当我运行工作空间后(为了看起来比较清晰,我手动编辑了一些位),下面是运行的结果:


瞧!我凭空创建了一个XML文档,并且将需要的内容填充了进去。


最新消息!
      和大多数FME的任务一样,至少有两种方法来完成相同的任务。我刚刚收到一个演示(demo),这个演示(demo)使用了别的方法替代XMLSampleGenerator/XMLUpdater这个组合,我认为我应该将它展示出来。

XMLTemplater 并不是2011新增的转换器,它的更新部分在于合并了XML样本生成的功能


当我点击“生产(Generate)”按钮时,将弹出一个与XMLSampleGenerator非常相似的对话框。选择XSD并点击确定(OK)….


…我得到创建的示例/模板,并进入这个对话框。现在,不使用XMLUpdater,我可以将左侧面板中的属性插入到模板中的正确位置。

为什么我会选择这个方法呢?很开心你这样问。对我来说,这样更新数据更简单,因为我能看到需要更新的地方与文档中其他部分的关系,并且我不需要手动定义路径。在XMLUpdater中没有相同的可视效果和功能。

换句话说,XMLUpdater是对字段名进行操作而不是某个固定的位置;以为着它更像一个通配符替换。因此,如果有很多记录需要更新和删除,那么使用XMLUpdater会是更好的办法。


好了。这封邮件完全以XML为中心,我将不会道歉因为我知道越来越多的用户需要处理XML数据。

如果你对这个话题感兴趣,在五月我们将有XML 培训。 将有关于XML读取和XML写入的培训会议,将提供北美和欧洲两个时区的培训。



















猜你喜欢

转载自blog.csdn.net/fmechina/article/details/80985498
今日推荐