结构元素

每个功能映射规则都可以包含可选的元素,允许源于映射规则的匹配元素的XML子树,作为属性列表添加到正在构造的FME功能。FME属性列表行为就像原始属性一样,除了它们可能包含在括号中括起来的索引以标识列表的元素。属性列表元素可以包含原语或其他属性列表。

属性列表索引可能与XML子树元素顺序不对应。考虑以下根为的XML子树:

     

元素的一个重复子元素,但是列表属性的索引必须在无间隙的情况下增加,因此当我们交织重复子元素时,的子元素的顺序就会丢失:

{0}。b {0}
{0}。b {1}
{0}。b {2}
一个{0}. c {0}

一个特征映射规则中的结构指令可以由一个空的元素指定。这将引导XML阅读器从以匹配元素为根的子树开始构造FME属性列表:

<映射匹配= "……" > < feature-type >…< / feature-type > < >属性…几何属性< / > < >…< /几何> <结构/> < / >映射

下面是可以在元素上设置的完整选项集,所有选项都是可选的:

选项名称 描述 默认值 可能的值
分隔符 用于为子元素的属性命名的分隔符 任何字符串
open-list-brace 打开列表索引分隔符大括号 任何字符串
close-list-brace 关闭列表索引分隔符大括号 任何字符串
map-empty-elements 指定是否将空元素作为空特性属性添加。 是的 是的|不
matched-prefix 指定特征属性是否应该以匹配元素的名称作为前缀 是的 是|否|子|属性
matched-attributes 指定是否应该将匹配元素的XML属性映射为特性属性 是的 是的|不
matched-ancestor-attributes 指定匹配元素的祖先元素,该元素的XML属性应该映射为特性属性 ”“

以下空间分隔值:

父|祖父母|根|任意整数值

基数 控制属性是否应该作为列表属性输出 + {?} 参考下面的文档
除了 特性路径表达式,用于指定在映射中应该排除匹配元素的哪些子元素 ”“ 功能路径XFMAP表达式
structure-prefix 为该结构生成的每个属性的前缀 ”“ 非空字符串
child-position-attribute 如果设置为非空字符串,则匹配元素的每个子元素生成一个附加功能属性,其值是其父级中的子的位置。 ”“ 非空字符串
attribute-identifier XML属性的特性属性名称以指定的值作为后缀。 ”“ 非空字符串

考虑以下XML文档a_items.xml:

a_items.xml

<?xml version = " 1.0 " ?>  a0b0 a0c0 a0b1 a0e a0b2    

下面的xfMap文档,a.xmp,将每个元素映射到一个FME特性,同时将根在的子树转换为属性列表:

a.xmp:

<?xml version =“1.0”?>      > <结构/>   

a.xmp从a_items.xml构造以下特性:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
功能类型:“
属性(字符串):a {0} .b {0}'具有值a0b0'
属性(字符串):{0}。B{1}'有值a0b1'
属性(字符串):{0}。B{2}'有值a0b2'
属性(string): a{0}.c{0}' has value a0c0'
属性(字符串):{0}. c{0}。X '有一个值X -val'
属性(字符串):{0}. c{0}。Y '的值是Y -val'
属性(字符串):{0}.d{0}。E{0} `有值a0e `
属性(string): xml_type' has value xml_no_geom'
几何类型:未知(0)
============================================================================

FME属性列表中的XML属性在没有索引的情况下表示。请注意,a_items.xml文档中元素的x和y属性在fme功能中没有列表索引。

需要注意的是,上面示例中的元素没有作为属性映射到FME特性,这是因为没有字符内容。要使XML读取器创建相应的FME特性列表属性为{0}。f{0}和{0}。G{0}分别为空的和< G >元素,可选map-empty-elements结构元素的XML属性应该设置为yes。例如:

<?xml version = " 1.0 " ?>   > map-empty-elements= " yes " />   

此外,还可以通过让XML阅读器在XML属性的名称后面附加前缀来区分XML属性与叶元素。<结构>元素可以有一个可选的attribute-identifierXML属性其值将成为FME属性列表中名称的前缀。

如前所述,生成的属性名中的列表索引只保留具有相同名称的元素的顺序。的child-position-attribute属性可以在结构元素上使用,以保留所有子元素的排序,无论名称如何。指定此属性时,每个子元素将生成一个附加的功能属性,其值将是其父元素中的子元素的位置。属性的名称将是表示元素路径的列表前缀,其次是值的child-position-attribute属性。如果attribute-identifier属性,它将在特性的位置属性中使用。

考虑应用以下xfMap, a1。Xmp,到structures_items.xml文档。xfMap将'@'添加到每个列表组件中,这些组件的名称来源于根为的子树中的元素的xml属性。此外,每个子元素都有一个' pos '属性,包含它在父元素中的位置。

a1.xmp:

<?xml version = " 1.0 " ?>    attribute-identifier= " @ "child-position-attribute= " pos " />    .

FME特性构造:

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
功能类型:“
属性(字符串):a {0} .b {0}'具有值a0b0'
属性(字符串):{0}。B{1}'有值a0b1'
属性(字符串):{0}。B{2}'有值a0b2'
属性(string): a{0}.c{0}' has value a0c0'
属性(字符串):{0}. c{0}。@x'有一个值x-val'
属性(字符串):a {0} .c {0}。@ y'具有首先y-val'
属性(字符串):{0}.d{0}。E{0} `有值a0e `
属性(string): xml_type' has value xml_no_geom'
几何类型:未知(0)
===========================================================================

前缀也可以附加到通过匹配元素的结构生成的每个FME属性列表。xfmap 元素可以具有可选的structure-prefix其值成为属性列出前缀的属性。以下A2.xmp XFMAP文档通过在构造功能的属性列表中添加“mystructureprefix-”前缀来扩展A1.xmp。

a2.xmp:

<?xml version = " 1.0 " ?>    structure-prefix=“MyStructurePrefix-”属性 - 标识符=“@”/>   

应用a2。xmp xfMap到structures-items.xml文档使得XML阅读器构造以下特性:

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
功能类型:“
属性(string): myStructurePrefix-a{0}。B{0}'有值a0b0'
属性(string): myStructurePrefix-a{0}。B{1}'有值a0b1'
属性(string): myStructurePrefix-a{0}。B{2}'有值a0b2'
属性(string): myStructurePrefix-a{0}.c{0}' has value a0c0'
属性(string): myStructurePrefix-a {0} . c{0}。@x'有一个值x-val'
属性(string): myStructurePrefix-a {0} . c{0}。@y'有一个值y-val'
属性(string): myStructurePrefix-a {0} .d{0}。E{0} `有值a0e `
属性(string): xml_type' has value xml_no_geom'
几何类型:未知(0)
===========================================================================

在上面的示例中,用于特征上的属性的分隔符是“。”。因此,元素'd'的元素'e',元素'a'的子的子元素被表示为{0} .d {0} .e {0}。每个<结构>元素可以有一个可选的分隔符属性(默认为句点字符)。分隔列表属性索引的大括号也可以被替换。打开和关闭列表分隔符也可以被可选的打开列表大括号和关闭列表大括号属性替换,这些属性的默认值分别是'{'和'}'。

下面的示例更改了默认的分隔符和列表花括号:

a3.xmp:

<?xml version = " 1.0 " ?>    分隔符= " - "开放列表——撑= " _ "close-list-brace= " " />    .

FME特性构造:

++++++++++++++++++++++++++++++++++++++++++++++++++++
功能类型:“
属性(字符串):a_0-b_0'具有值a0b0'
属性(string): a_0-b_1' has value a0b1'
属性(string): a_0-b_2' has value a0b2'
属性(string): a_0-c_0' has value a0c0'
属性(字符串):a_0-c_0 - x'具有value x-val'
属性(string): a_0-c_0——y' has value first y-val'
属性(string): a_0-d_0——e{0}' has value a0e'
属性(string): xml_type' has value xml_no_geom'
几何类型:未知(0)
====================================================

还可以告诉XML Reader在构造属性列表时不要将匹配的元素作为前缀添加。这是通过设置可选的matched-prefix属性xfMap <结构>元素“不”。该属性的有效值为“yes”、“no”、“children”和“attributes”,默认值为“yes”。如果设置为" yes ",则匹配元素的属性和子元素都将以匹配元素的名称作为前缀。如果它被设置为" children "或" attributes ",那么只有匹配元素的子元素或属性被分别作为前缀。

例如,应用以下内容xfmap a4.xmp.到a_items.xml文档将删除一个{0}构造FME特性属性列表中的组件:

a4.xmp:

<?xml version =“1.0”?>       <结构匹配 -前缀=“否”属性 - 标识符=“@”/>   

注意,a{}组件没有出现在属性列表中:

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 功能类型:b的属性(编码:utf - 16):{0}“有价值”a0b0的属性(编码:utf - 16):{0}。@pos' has value ' 0'属性(encoded: utf-16): ' b{1}' has value ' a0b1'@pos' has value ' 2'属性(encoded: utf-16): ' b{2}' has value ' a0b2'属性(encoded: utf-16): ' b{2}. '@pos' has value ' 4'属性(encoded: utf-16): ' c{0}' has value ' a0c0'属性(encoded: utf-16): ' c{0}. '@pos' has value ' 1'属性(编码:utf-16): ' c{0}. '属性(编码:utf-16): ' c{0}. '属性(编码:utf-16): ' d{0}. '@pos `有值`3 `属性(编码:utf-16): ` d{0}。属性(encoded: utf-16): ' d{0}.e{0} ' has value ' a0e';@pos' has value ' 0'属性(编码:utf-16): ' f{0}. '@pos `有值' 5'属性(编码:utf-16): ' g{0}. '@pos 6“有价值”的属性(string): xml_type有价值xml_no_geom的几何类型:未知(0 ) ===========================================================================

可选的matched-attributes属性可用于控制是否将匹配元素的属性映射为FME特征属性。该属性的有效值为“yes”和“no”,默认值为“yes”。

例如,将以下XFMAP A5.xmp应用于A_ITEMS.xml将忽略元素“C”的“x”和'y'属性。

A5.xmp:

<?xml version = " 1.0 " ?>       

注意,元素'c'的属性被忽略,只有文本被映射为属性:

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 功能类型:c c的属性(编码:utf - 16):“有价值”a0c0”属性(string):“xml_type价值xml_no_geom的几何类型:未知(0 ) ===========================================================================

在那些已知xml只允许元素的单个实例的实例中,还可以控制属性的外观。例如,在上面的示例中,元素可能被限制只出现一次。在这些情况下,list-suffix会混淆属性名。structure元素引入了一种小型语言来定义元素的基数。下面给出一个例子,然后进行更详细的讨论。

A6.xmp:

<?xml version = " 1.0 " ?>       

FME特性构造:

++++++++++++++++++++++++++++++++++++++++++++++++++++
功能类型:“
属性(字符串):b'有值a0b0'
属性(string): b{1}' has value a0b1'
属性(string): b{2}' has value a0b2'
属性(字符串):c'有值a0c0'
属性(字符串):c。@ x'具有首先x-val'
属性(字符串):c。@ y'具有首先y-val'
属性(string): d{0}。E '有价值a0e'
属性(string): xml_type' has value xml_no_geom'
几何类型:未知(0)
====================================================

基数属性是由空格分隔的基数指示列表。在前面的例子中,字符串是:

  1. c * /
  2. {} * / d / +
  3. * / +

每个斜杠分隔的元素表示xml文档中的一个元素。星号作为通配符,匹配任何元素。字面值字符串与元素的名称相匹配。使用大括号({})表示元素应该像列表一样处理,而如果可能的话,不使用大括号表示元素应该被视为单数。带问号({?})的大括号表示可选列表。在这种模式下,如果元素有同名的兄弟元素,那么它们将被视为一个列表。如果他们没有共同的名字,他们将是单数。最后,末尾的'+','+{}'或'+{?}' indicates that any further elements along this path through the xml-document should be treated as non-list (+), list ({}) or optional list ({?}) elements.

在上面的例子中,基数(1)匹配元素(根)和元素。这表明根元素和元素都应该被视为单数。属性总是单一的。

基数(2)匹配元素,然后是应该被视为列表的元素,后跟任何数量的属性,所有这些都应被视为非列表。

最后,基数(3)匹配根部,后跟任何其他XML元素,所有这些都应被视为单数。在这种情况下,“* / +”修复了与“+”具有完全相同的属性集的基数。

以下规则用于确定匹配:

  1. 文字匹配优于通配符匹配。例如,a/+优于*/+
  2. 在基数表达式中较早出现的文字匹配优先于较晚出现的文字匹配。例如,a/*/*优先于*/b/*。
  3. 非列表元素优于列表元素。所以/*/foo/更适合于/*/foo{}/。
  4. 列表元素比可选列表元素更受欢迎。所以/*/foo{}优于/*/foo{?}。

这并没有提供基数表达式的总排序,因为例如a/b/c应该与d/e/f完全相同的排序方式,但因为它们不会匹配相同的元素,所以顺序没有关系。基数表达式的基本元素是:文字匹配,由匹配xml元素名称的字符组成;通配符匹配:"*{}","*"只匹配一个元素,并将其视为列表或非列表(分别);和一个可选后缀:+,+{}或+{?}to indicate that any further matches should be treated as non-list, list or optional list (respectively).

在没有找到匹配项的情况下,默认行为是假设基数被指定为“+{}”。为了匹配,属性路径(例如。<一> < b > < c / > < / b > < / >相匹配的a.b.c)必须与基数表达式的长度完全相同。唯一的例外是后缀“+”,“+{}”和“+{?}” extend the cardinality expression as long as is necessary to match a string.

除了指定元素名称外,转发斜杠分隔元素还可以包括命名空间前缀和冒号。如果指定了命名空间前缀,则还必须指定冒号。在所有情况下,还必须指定元素名称(可能是通配符)。如果没有给出命名空间前缀,则效果与指定前缀的通配符相同。可以指定“空白”前缀,在结肠之前没有任何内容。在这种情况下,它只会匹配实际元素的前缀是空字符串。

换句话说:

  1. A / B / * / +与*:A / *:B / *:C / +
  2. A /:b/c将匹配A 元素但不匹配A < A >元素(其中< A >和匹配)

'+', '+{}'和'+{?}’ suffixes do not currently take a namespace specifier.

如果有人想要在属性的名称中包含前缀(以便将来自不同名称空间的元素视为其FME功能上的不同属性),则必须设置该属性“use-namespace-prefix“在结构元素上”是“。

请注意,跳过匹配属性和基数属性之间没有交互。这意味着即使skip-matched="yes",基数表达式中的元素仍然必须与它匹配。例如,如果我们在a5中指定了结构元素。xmp是

 .

结果是唯一匹配的是*/+,因为其他的基数表达式都不匹配元素。通常情况下,这只是意味着基数表达式中的第一个元素应该是通配符或匹配元素的名称。如果您希望匹配许多不同的元素,其中一些元素具有不同的基数约束,那么这将非常有用。它允许编写非常简洁的xfmap。

A7.xmp

<?xml版本=“1.0”?>     <匹配的expr =“local-name”/>     

上面的示例将匹配元素“a-list”的子元素,根据匹配的元素命名特性,然后使用给定的基数来确定如何写出属性。

最后,我们通常希望从转换为FME属性的xml树中排除一些元素。一个明显的例子如下,我们想要将所有的xml叶子元素映射到FME属性,除了那些用来构造特征的几何形状的属性。

A8.xml:

<?xml version = " 1.0 " ?>  Downtown Harbour 132 years  100 54.2   EastSide Harbour 38 years  101.2 54.8  

A9.xmp:

<?xml version = " 1.0 " ?>          除了="lat lon"/>    .

FME特性构造:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
功能类型:港”
属性(字符串):name' has value Downtown Harbour'
属性(字符串):age' has value 132'
属性(string): xml_type' has value xml_point'
几何类型:IFMEPoint
(100,0,58.2)
功能类型:港”
属性(字符串):name' has value Eastside Harbour'
属性(字符串):age' has value 37'
属性(string): xml_type' has value xml_point'
几何类型:IFMEPoint
(101 2 54.8)
========================================================================

这里我们显式地排除xml元素,以便使用几何标记提取它们(在xfMap文档的其他地方讨论)。这避免了具有镜像几何体的属性。

除了属性接受与映射规则的匹配或例外属性相同的表达式类型。例如,表达式except= " parent/child{2} "可用于从结构子规则的输出中排除元素中包含的第二个元素。

注意:目前,元素不能在一个特性上并行构造-一次只能构造一个。