许多用户在阅读复杂的xml或gml时存在问题。方法是使用FME的XML阅读器,无论是用功能路径,它在给定节点上查询XML,并可以选择扁平化,或者一个xfMap这为查询XML和构建特性提供了广泛的选项。xfMaps的基本思想是,在feature mapping部分中指定要将xml结构中的哪个节点转换为功能类型。然后在feature content map部分指定这些特性中包含的内容。
然而,有时这很困难,因为源xml可能没有任何模式。相反,在某些情况下,模式嵌入到数据本身中。
考虑以下xml:
约翰 温哥华 11-22-99 12-11-09
我们可以将Feature节点标识为我们想要捕获的元素,作为我们的特性类型。然而,简单地使用一个名为property的属性并不是很有用,因为我们可能会得到重复的列或列表,比如:
财产1 =约翰财产2 =温哥华等
更好的方法是从名称-值对动态构建模式,这样名称就变成了属性名,值就变成了属性值。我们可以做到这与以下“序列”xfmap:
'mapping match="property"'只选择每个property元素。'name extract @typeName'创建一个属性,该属性的名称存储在属性标签中的@typeName中,并分配与相同属性元素关联的值。
因此,对于
约翰
xfmap创建一个名为attribute1的字段,并在其中存储属性值“John”。
然后,这个xfmap可以读取上面的xml并从中生成以下特性:
attribute1 = John attribute2 = Vancouver activeDate_from = 11-22-99 activeDate_to = 12-11-09
如果你有可选的或多个几何图形,然后需要启用聚合。我将很快在另一个例子中解释如何做到这一点。
假设我们想读取下面的源xml。上面的动态模式方法允许我们读取下面的所有属性
-123.1,49.25 - -122.9,49.15 约翰 温哥华 11-22-99 12-11-09 -122.8,49.12 - -122.5,49.0 6月 萨里 02-25-05 9-15-10
如何添加几何图形?在我所见过的大多数动态模式案例中,几何本身并不是完全动态的。对于这种类型的xml,通常有一组已知的几何图形。每个特征可能包含也可能不包含每个几何形状,但必须有一些预定义的方式来存储几何图形,否则就太困难了。当然,如果每个特性只是在属性中嵌入了坐标值,FME总是可以使用2dPointReplacer将这些点从工作台内转换为点。
在这个例子中,我们有一个与基本例子中类似的边界框。注意,我们不需要定义异常,因为第一个映射匹配只匹配属性,而不匹配Coordinate_BOX,所以我们要做的就是显式地匹配Coordinate_BOX,然后像我们在“基本”示例中所做的那样构建几何体:
在我们结束之前,添加一些几何特性怎么样?从上面的源数据可以看出,几何图形有唯一的标识符:
如果每个特性有多个几何图形,并且需要能够像GML 3.2.1中那样分别识别它们,那么保存这些几何图形就变得尤为重要。
我们可以使用到feature map的reference map来捕获这个值,如下所示:
这只告诉FME创建一个名为identifier的引用,并在读取器遍历源xml时遇到identifier时将其值存储在其中。然后,每当我们想要检索标识符的值时,我们将得到最后一个存储(LIFO)。这允许子元素在扫描父元素时检索值集。
那么,我们可以修改几何部分,包括如下特征:
不定义属性,我们定义一个特征,而不是一个提取表达式,我们使用refexpr或引用表达式来检索前面在创建引用时设置的值。注意,我们可以定义一个新的reference map部分,而不是将它放在feature map中,但是,只有当我们希望能够从非特性元素或其中的元素中捕获标识符时,才需要这样做。
把它们放在一起,现在我们有了一个xfmap,它将创建一个新的特性类型
http://www.w3.org/1999/xlink" >
请注意:
本文展示了一种更简单的方法:
使用xmlflater读取复杂的XML或GML
许多用户在阅读复杂的XML时存在问题。在FME基金XML阅读器几乎可以读取任何XML,无论是用功能路径,它在给定节点上查询XML,并可以选择扁平化,或者使用xfMap,它为查询XML和构建特性提供了广泛的选项。XfMaps指定要在feature mapping部分中将其转换为功能类型的xml结构中的节点。然后,在feature content map部分中指定每个特性包含什么。然而,虽然欢迎您探索xfMaps的灵活性,由于学习新的脚本语法通常需要时间,我们强烈建议您尝试一下特征路径与扁平化首先看看这是否能满足你的需求,因为特性路径不需要脚本。使用xfMap的惟一原因是,如果您想要一些XML阅读器的高级特性路径设置(例如,复杂的几何处理,动态模式,等等)。
如果你还想研究xfMaps,下面是一个非常基本的例子,可以帮助您入门。然后,您可以对其进行添加,并在以后使其尽可能复杂。
约翰 温哥华 11-22-99 12-11-09 -123.1,49.25 - -122.9,49.15 6月 萨里 02-25-05 9-15-10 -122.8,49.12 - -122.5,49.0
要真正读取这些数据,您需要将源文件粘贴到source.xml文件中,或从本页底部下载。然后,您可以将其拖放到Workbench中,选择通用XML阅读器,然后点击“参数”按钮,为配置类型选择xfmap,然后浏览到xfmap文件。如果您的xfmap配置正确,您应该得到一个名为Field的新特性类型和一个名为attr1的字段。注意,它没有几何形状,所以要查看可以连接到可视化器的内容,运行它,然后选择'视图没有几何'在查看器。祝贺你,您刚刚创建了第一个xfmap来解析xml源文件。
…
在读取“feature”元素时构造一个FME特性。