主题中的问题:“xmlfeaturemapper” https://knowledge.亚搏在线safe.com/questions/topics/single/1174.html 主题“xmlfeaturemapper”的最新问题 动态xfMap例子 https://knowledge.亚搏在线safe.com/articles/1180/dynamic-xfmap-example.html

描述

许多用户在阅读复杂的xml或gml时存在问题。方法是使用FME的XML阅读器,无论是用功能路径,它在给定节点上查询XML,并可以选择扁平化,或者一个xfMap这为查询XML和构建特性提供了广泛的选项。xfMaps的基本思想是,在feature mapping部分中指定要将xml结构中的哪个节点转换为功能类型。然后在feature content map部分指定这些特性中包含的内容。

XFmap排序属性

然而,有时这很困难,因为源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的例子

假设我们想读取下面的源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
            
         
        

向动态模式xfmap添加几何图形

如何添加几何图形?在我所见过的大多数动态模式案例中,几何本身并不是完全动态的。对于这种类型的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,它将创建一个新的特性类型 ,对象中定义的所有元素 标签属性,然后加上框的几何形状。


完成“动态模式示例”XFmap

 
        
       
        http://www.w3.org/1999/xlink" >
             
                
           
            
                   
                     
            	     
             
              
             	     
             
              
             	   
            	 
                 
                    	   	        
           
             
                
                   
                      
             
              
                       
             
              
                      
                  
               
              
                
                   
                      
             
              
                       
             
              
                     
                    
            	   
                            
               
            
        	 
        
xml gml xfmaps xmlfeaturemapper 星期五,2016年9月23日14:50:09 GMT robynr
使用XfMap读取复杂的XML或GML https://knowledge.亚搏在线safe.com/articles/1175/reading-complex-xml-or-gml-using-xfmap.html

请注意:
本文展示了一种更简单的方法:
使用xmlflater读取复杂的XML或GML

描述

许多用户在阅读复杂的XML时存在问题。在FME基金XML阅读器几乎可以读取任何XML,无论是用功能路径,它在给定节点上查询XML,并可以选择扁平化,或者使用xfMap,它为查询XML和构建特性提供了广泛的选项。XfMaps指定要在feature mapping部分中将其转换为功能类型的xml结构中的节点。然后,在feature content map部分中指定每个特性包含什么。然而,虽然欢迎您探索xfMaps的灵活性,由于学习新的脚本语法通常需要时间,我们强烈建议您尝试一下特征路径与扁平化首先看看这是否能满足你的需求,因为特性路径不需要脚本。使用xfMap的惟一原因是,如果您想要一些XML阅读器的高级特性路径设置(例如,复杂的几何处理,动态模式,等等)。

如果你还想研究xfMaps,下面是一个非常基本的例子,可以帮助您入门。然后,您可以对其进行添加,并在以后使其尽可能复杂。

源XML的例子

假设我们想读取下面的源xml:

       

       
 
        
  
         
          约翰
         
  
         
          温哥华
         
  
         
     
          
           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
          
  
         
 
        

       

XfMap功能类型

可以看到,它有一个嵌套结构。所以我们要做的第一件事是决定在FME中哪个节点代表我们的特性类型。我们可以选择特征回忆,但是我们会得到一个巨大的记录。或者我们可以选择activeDate作为我们的功能类型,但是这样我们就会丢失很多其他信息。在这种情况下,最好的特征类型是在节点上 。我们已经看到,这应该包含两个特性,因为源xml中有两个特性块。


在Xfmaps中,我们使用功能映射来定义功能类型。在这种情况下,它看起来像:

        

        
  
         
  
          
  
            
             
           
  
          
         
        

这告诉FME在读取“feature”元素时构造一个特性。注意,我们还没有定义任何内容,所以这只是一个容器,我们稍后将填充它。

XfMap属性

因此,让我们为新特性类型定义一些内容。这里的技巧是,我们可以根据需要读取尽可能多或尽可能少的xml。唯一的限制是xfmap只处理一次匹配,所以只有第一个匹配才会被使用。让我们从简单的开始。
        

        
 
         
  
          
  
            
             
           
  
          
 
         
 
         
  
          
  
           
  
            
  
              
               
             
  
              
               
             
  
               
  
           
  
          
 
                

        

映射match ="attribute1"告诉我们要匹配哪个节点。 标签定义了我们想要创建的属性。 , 指定实际字段名和值。extract expr="."定义字段的内容。“.”部分表示从当前匹配的元素中获取值。

用你XfMap

要真正读取这些数据,您需要将源文件粘贴到source.xml文件中,或从本页底部下载。然后,您可以将其拖放到Workbench中,选择通用XML阅读器,然后点击“参数”按钮,为配置类型选择xfmap,然后浏览到xfmap文件。如果您的xfmap配置正确,您应该得到一个名为Field的新特性类型和一个名为attr1的字段。注意,它没有几何形状,所以要查看可以连接到可视化器的内容,运行它,然后选择'视图没有几何'在查看器。祝贺你,您刚刚创建了第一个xfmap来解析xml源文件。

XfMap多个属性

添加更多字段如何?好吧,我们可以为每个字段建立单独的映射,但是在一个映射表达式中列出我们想要的所有字段更容易。替换之前的 部分:

  
            
  
             
  
              
  
                 
                 
               
  
                 
                  
               
  
                 
  
             
  
              


这将为attribute1和attribute2创建字段。local-name将保持名称与匹配的标记相同,和"."将提取匹配的值。这样设置更短,但不允许重命名字段。

XfMap嵌套属性提取

那么嵌套的日期结构呢?对于传统的关系或简单的特性类型xml或gml读取器来说,这通常会带来麻烦。通常这些字段根本就不读,被解读为某种列表结构,或者以xml blob的形式出现。


要读取日期字段,我们可以做到以下几点:

   
            
  
             
  
              
     
                 
                 
               
     
                
                 
               
  
                 
  
              
     
                 
                 
               
     
                
                 
               
  
                 
  
             
  
            

因为我们在activeDate上匹配,当匹配发生时,它就成为我们在xml文档中的相对位置。我们可以创建一个date字段,并给它赋值“.”,然后我们将得到一个包含xml的字段。更好的选择是钻取对象结构并创建两个新字段,一个用于date_start,一个用于date_end。We do this by using an extract expression "./from" "./to" which tells FME to pull out the values from the from and to properties,分别。


记住,如果你列出activeDate和attribute1和2,然后,匹配表达式将捕获activeDate作为具有嵌套xml内容的字段,第二个activeDate匹配表达式将被忽略。


xfmaps的一个限制是错误报告并不总是描述性很强,通常只会告诉你xfmap的第一个问题,因此,您将需要从简单的开始,逐步了解xfmap语法的来由。

XfMap几何

最后但并非最不重要的,让我们为我们的特性添加一些几何图形。为此,我们需要在特性中找到定义几何图形的元素,然后选择适当的xfmap对象类型来解释几何图形。让我们匹配Coordinate_BOX并使用它创建一个xml框。

  
               
  
             
  
              
  
                  
     
  
                
  
            

因此,我们像往常一样在feature content map中创建一个映射匹配。但是,这一次我们使用geometry_activate命令告诉FME我们想要创建一个xml框几何体。还有xml点,xml-line,xml-area和许多其他我们可以使用的几何类型。这些都在阅读器和编写器手册的XML - Xfmaps部分中定义。


记住,每次添加到xfmap时,都需要重新导入数据集,或者至少删除并重新添加特性类型,以便读取新的模式信息(属性或几何定义)。如果您的工作区不知道您的模式更改,然后,即使您已经将它们添加到xfmap中,它也会忽略它们。

XfMap几何特征

最后,让我们在几何图形中添加一些特征。特征是与特性上的单个几何图形相关联的标记或属性。当我们有多个与一个特性关联的几何图形时,这些就变得尤为重要。通常需要定义几何id,比如gml_id。


要添加特性,我们使用 几何定义中的标签如下:
  
                
     
              
  
               
  
                
  
               
  
               
  
                
  
               
  
              

@符号告诉FME从 对象。


以上就是我们的“基本”示例。我还会添加一些快捷方式和其他几何图形的例子,但是希望这将帮助您开始阅读xml,无论xml的源代码或结构是什么。

完成XfMap

把它们放在一起,下面是完整的xfmap文件,它从源xml中读取所有数据:
              

              
  
               
  
                
                 在读取“feature”元素时构造一个FME特性。
                
  
                
  
                  
                   
                 
  
                          
  
                          
  
               
  
                
  
                 
  
                  
  
                    
                     
                   
  
                    
                     
                   
  
                     
  
                 
  
                   
  
                
  
                 
  
                  
     
                    
                     
                   
     
                    
                     
                   
  
                     
  
                  
     
                    
                     
                   
     
                    
                     
                   
  
                     
  
                 
  
                   
  
                   
     
                 
     
                  
       
                   
     
                  
     
                  
       
                   
     
                  
   
                    
  
                 
  
                  
  
                      
     
  
                    
  
                   
  
                      

              

xml gml xmlfeaturemapper 星期四,2015年10月08日格林尼治时间19:15:42 KenAt亚搏在线Safe