我尝试使用DIH从我不维护的XML源导入数据。此XML具有按属性分组的可选元素,例如颜色或风格。并非所有实体都具有所有属性,这些属性非常精细且有效。可悲的是,当我仍然想要它们时,DIH会跳过这些实体。这是我的data-config.xml
<dataConfig>
<dataSource type="FileDataSource" name="datasource"/>
<document>
<entity
name="files"
processor="FileListEntityProcessor"
baseDir="C:\\"
fileName="recipe_page.*xml"
recursive="false"
rootEntity="false"
dataSource="null">
<entity
name="file"
processor="XPathEntityProcessor"
url="${files.fileAbsolutePath}"
forEach="/results|/results/recipe"
stream="true"
transformer="TemplateTransformer">
<field column="recipe_id" xpath="/results/recipe/recipeID" />
<field column="recipe_title" xpath="/results/recipe/recipeTitle" />
<field column="color" xpath="/results/recipe/attributes/Color" default="" />
<field column="drink_classification" xpath="/results/recipe/attributes/DrinkClassification" default="" />
<field column="flavor" xpath="/results/recipe/attributes/Flavor" default="" />
<field column="uid" template="recipe_${file.recipe_id}" />
<field column="document_type" template="recipe" />
</entity>
</entity>
</document>
</dataConfig>
如何告诉DIH忽略缺失元素或至少为这些元素设置默认值?
答案 0 :(得分:0)
我不确定,我知道如何让XPathEntityProcessor
知道忽略丢失的xpath语句,但我有一个想法,你可以使用Transformer设置字段的默认值特别是TemplateTransformer
您可以使用模板转换器构建或修改字段 值,也许使用其他字段的值。你可以插入额外的 文字进入模板。
我希望这样的事情适合你:
<entity name="en" pk="id" transformer="TemplateTransformer" ...>
<!-- generate a full address from fields containing the component parts -->
<field column="color" template="default-color" />
</entity>
我试图用一个值替换字段值,但是,我不确定它会有用(我希望它替换值,如果它存在,但是,它应该被双重检查)
在这种情况下,可以创建自定义Transformer:
public class DefaultValueTransformer {
public Object transformRow(Map<String, Object> row) {
String color= row.get("color");
if (artist != null)
row.put("color", "default-color-value");
return row;
}
}
以后用作:
<entity name="entity" query="..." transformer="my.package.DefaultValueTransformer">