结构元素

每个特性映射规则都可能包含一个可选的元素,该元素允许将基于映射规则匹配元素的XML子树作为属性列表添加到构建中的FME特性中。FME属性列表的行为与原始属性一样,除了它们可能包含一个用大括号括起来的索引来标识列表中的元素。属性列表元素可以包含原语或其他属性列表。

属性列表索引可能与XML子树元素顺序相对应。考虑以下XML子树植根于

<一> < / b > < c / > < / b > < / b > < / >

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

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

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

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

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

<结构map-empty-elements =“是|不是”attribute-identifier = "……“child-position-attribute = "…“structure-prefix = "…”分隔符= "…" open-list-brace = "……“close-list-brace = "…match -prefix= " yes|no|children|attributes " match -attributes= " yes|no " cardinality= "…" use-name - space-prefix= " yes|no " except="…
选项名称 描述 默认值 可能的值
分隔符 用于为子元素的属性命名的分隔符 任何字符串
open-list-brace 打开列表索引分隔符大括号 任何字符串
close-list-brace 关闭列表索引分隔符大括号 任何字符串
map-empty-elements 指定是否将空元素作为空特性属性添加。 是的 是的|不
matched-prefix 指定特征属性是否应该以匹配元素的名称作为前缀 是的 是的|不| children | attributes
matched-attributes 指定是否应该将匹配元素的XML属性映射为特性属性 是的 是的|不
匹配 - 祖先属性 指定匹配元素的祖先元素,其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版本=“1.0”?>      > <结构/>   

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

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
功能类型:“
属性(字符串):{0}。B{0}'有值a0b0'
属性(字符串):{0}。B{1}'有值a0b1'
属性(字符串):{0}。B{2}'有值a0b2'
属性(字符串):a {0} .c {0}'具有值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属性列表中的XML属性不使用索引表示。注意,a_items.xml文档中元素的x和y属性在FME特性中没有列表索引。

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

<?xml版本=“1.0”?>      > <结构map-empty-elements= " yes " />   

此外,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特性构造:

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
功能类型:“
属性(字符串):{0}。B{0}'有值a0b0'
属性(字符串):{0}。B{1}'有值a0b1'
属性(字符串):{0}。B{2}'有值a0b2'
属性(字符串):a {0} .c {0}'具有值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属性列表上。xfMap 元素可以有一个可选的structure-prefix属性,其值成为属性列表前缀。以下a2。xmp xfMap文档扩展a1。通过将“myStructurePrefix-”前缀添加到所构造特性的属性列表中来实现。

a2.xmp:

<?xml version = " 1.0 " ?>    structure-prefix="myStructurePrefix-" attribute-identifier="@"/>    .

应用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)
===========================================================================

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

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

a3.xmp:

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

FME特性构造:

++++++++++++++++++++++++++++++++++++++++++++++++++++
功能类型:“
属性(string): a_0-b_0' has value 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'有一个值x-val'
属性(String):a_0-c_0 - y'具有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{}组件没有出现在属性列表中:

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++功能类型:“Attribute(encoded: utf-16): `b{0}' has value `a0b0' Attribute(encoded: utf-16): ` b{0}.@pos' has value `0' Attribute(encoded: utf-16): ` b{1}' has value `a0b1' Attribute(encoded: utf-16): ` b{1}.@pos' has value `2' Attribute(encoded: utf-16): ` b{2}' has value `a0b2' Attribute(encoded: utf-16): ` b{2}.@pos' has value `4' Attribute(encoded: utf-16): ` c{0}' has value `a0c0' Attribute(encoded: utf-16): ` c{0}.@pos' has value `1' Attribute(encoded: utf-16): ` c{0}.@x' has value `first x-val' Attribute(encoded: utf-16): ` c{0}.@y' has value `first y-val' Attribute(encoded: utf-16): ` d{0}.@pos' has value `3' Attribute(encoded: utf-16): ` d{0}.e{0}' has value `a0e' Attribute(encoded: utf-16): ` d{0}.e{0}.@pos' has value `0' Attribute(encoded: utf-16): ` f{0}.@pos' has value `5' Attribute(encoded: utf-16): ` g{0}.@pos' has value `6' Attribute(string): xml_type' has value xml_no_geom' Geometry Type: Unknown (0) ===========================================================================

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

例如,应用以下xfmap A5。XMP到a_items.xml将忽略元素' c '的' x '和' y '属性。

A5.xmp:

<?xml version = " 1.0 " ?>       

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

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Feature Type: c' Attribute(encoded: utf-16): 'c' has value 'a0c0' Attribute(string): ` xml_type' has value xml_no_geom' Geometry Type: Unknown (0) ===========================================================================

还可以在已知XML仅允许元素的单个实例中来控制属性的外观。在上面的示例中,例如,元素可能被约束仅发生一次。在这些情况下,列表后缀会对属性名称进行混乱。结构元素引入了一种迷你语言来定义元素的基数。下面给出一个例子,然后更详细地讨论。

A6.xmp:

<?xml version =“1.0”?>          

FME特性构造:

++++++++++++++++++++++++++++++++++++++++++++++++++++
功能类型:“
属性(字符串):b'有值a0b0'
属性(string): b{1}' has value a0b1'
属性(string): b{2}' has value a0b2'
属性(字符串):c'有值a0c0'
Attribute(string): c.@x' has value first x-val'
属性(字符串):c.@y' has value first y-val'
属性(字符串):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).

在没有找到匹配项的情况下,默认行为是假设基数被指定为“+{}”。为了匹配,属性路径(例如。 相匹配的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将匹配元素,但不是元素(其中匹配)

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

如果想在属性名中包含前缀(为了将来自不同名称空间的元素作为其FME特性上的不同属性对待),必须设置属性“use-namespace-prefix对结构元素改为“yes”。

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

 .

结果是唯一的匹配将是* / +,因为其他基数表达式都不会匹配元素。在正常使用中,这只是意味着基数表达式中的第一个元素应该是通配符或匹配元素的名称。如果一个人希望匹配许多不同的元素,这可能是有用的,其中一些具有不同的基数限制。它允许写入很简单的XFMAPS。

A7.xmp

<?xml version = " 1.0 " ?>       

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

最后,我们经常希望将XML树的某些元素从转换为FME属性中排除。一个明显的案例是如下,我们是否希望将所有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
58.2 (100 0)
功能类型:港”
属性(字符串):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} "可用于从结构子规则的输出中排除元素中包含的第二个元素。

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