Skip to main content

Using the XML Reader with featurepath has some limitations. Especially when the XML Schema allows optional data, featurepath will only produce attributes where tags are in your XML-data (it doesn't know the Schema at all). This means that your Workspace may not work correct, when you get next delivery with other optional data inside. A second annoying issue is, that the decision wether using a list for a specific attribute or using a single attribute cannot be influenced. Therefore i often had the problem to deal the same data as list-attribute an as non-list-attribute in one workspace. Enough reasons to look for another solution --> xfmap.

With the documentation and some easy tutorials I did my first steps. Most things work fine but I cannot figure out how to manage nested lists like in the follwing code:

<data>
<KG>
<KG001>1001</KG001>
<KG211>2</KG211>
<KG301>K</KG301>
<KG302>R</KG302>
<KG305>S</KG305>
<KG306>ZES</KG306>
<KG999/>
<GO>
<GO001>1001</GO001>
<GO002>D</GO002>
<GO003>Pkt</GO003>
<GO999/>
<GP>
<GP001>1001</GP001>
<GP002>UTM</GP002>
<GP003>527138.862</GP003>
<GP004>5736538.884</GP004>
<GP007>100</GP007>
<GP999/>
</GP>
</GO>
<GO>
<GO001>1001</GO001>
<GO002>B</GO002>
<GO003>Pkt</GO003>
<GO999/>
<GP>
<GP001>1001</GP001>
<GP002>UTM</GP002>
<GP003>527138.708</GP003>
<GP004>5736538.718</GP004>
<GP007>98</GP007>
<GP999>S</GP999>
</GP>
</GO>
<GO>
<GO001>1001</GO001>
<GO002>B</GO002>
<GO003>Kr</GO003>
<GO999/>
<GP>
<GP001>1001 1</GP001>
<GP002>UTM</GP002>
<GP003>527138.208</GP003>
<GP004>5736538.718</GP004>
<GP007/>
<GP999/>
</GP>
<GP>
<GP001>1001 2</GP001>
<GP002>UTM</GP002>
<GP003>527138.708</GP003>
<GP004>5736538.718</GP004>
<GP007/>
<GP999/>
</GP>
<GP>
<GP001>1001 3</GP001>
<GP002>UTM</GP002>
<GP003>527138.208</GP003>
<GP004>5736538.718</GP004>
<GP007/>
<GP999/>
</GP>
</GO>
</KG>
</data>

My goal is to produce a Array like GO().GP() .GP001 in the feature KG. Has anybody managed to solve something like this with xfmap? Many thanks in advance.

Hi @hordor, you don't need to define an xfMap. When you add the XML reader to the workspace, open the parameters dialog and switch the XML Flatten Options dialog to Advanced mode.

0684Q00000ArJvqQAF.png

Then, modify the 'cardinality' attribute like this.

cardinality="KG/GO{}/GP{}/+ KG/GO{}/+ +{?}"

In fact, it's a part of xfMap. See the description in the dialog and here to learn more.

XML Reader Documentation | xfMap | Structure Element


Hi @takashi, that helps a lot. Thank you. I still have 2 questions. I have the problem that optional elements that are not in an XML (but might be in next data delivery) could not read by featurepath to be used as attribute. Is there a way to force FME to do so with xfmaps? My first trys showed that even when an element is specified inside xfmaps it will only be transformed to an attribute if it exists at least one time in an XML.

The second question belongs to except="". In the above sample I made the following xfmaps. Is there an easier way to exclude all KG* (but keep the GO/Gp-lists)?

<?xml version="1.0"?>
<xfMap>
<feature-map multi-feature-construction="true">
<mapping match="KG">
<feature-type>
<matched expr="local-name"/>
</feature-type>
<structure cardinality="KG/GO{}/GP{}/+ KG/GO{}/+" except="KG001 KG101 KG102 KG211 KG301 KG302"/>
</mapping>
<mapping match="HG">
<feature-type>
<literal expr="HG"/>
</feature-type>
</mapping>
</feature-map>
<feature-content-map>
<mapping match="KG001 KG101 KG102 KG211 KG301">
<attributes>
<attribute>
<name>
<matched expr="local-name"/>
</name>
<value>
<extract expr="."/>
</value>
</attribute>
</attributes>
</mapping>
<mapping match="KG302">
<attributes>
<attribute>
<name>
<literal expr="some_attr"/>
</name>
<value>
<extract expr="."/>
</value>
</attribute>
</attributes>
</mapping>
</feature-content-map>
</xfMap>

1. You can configure feature types with an xfMap. See the pages in this section.

XML Reader | xfMap | FME Schema Features

 

2. I don't think there is a way to do that with setting the "except" attribute. If you want to fully control the schema with xfMap, you will have to learn all the contents about feature mapping rules.XML Reader | xfMap | Feature Mapping Rules

 


Thanks for your help. I guess I have to build an example XML with all possible tags inside and will then use featurepath with cardinality to create features with all possible atttributes.


If you check 'Allow reader feature type editing' in the FME Options dialog (menu: Tools > FME Options), you can edit reader feature type. It might be possible to configure your desired reader feature type with modifying the "cardinality" attribute in the "Flatten Option (Advanced)" and editing the "User Attributes".


Reply