在我的研究过程中,我认为问题是fn-bea:serialize()功能。
我使用org.apache.xmlbeans
的XQuery引擎为每个 child node
写入命名空间,而OSB Transformation只为root node
写入。< / p>
以下是来自OSB的转换结果片段,其中调用了serialize()
函数:
<urn:XML>
<tns:telegramm TITLE="Universelle Messtelegramme" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="tns">
<tns:header ANGELEGT_AM="20160705" ANGELEGT_UM="221626" ANGELEGT_VON="ub2" ANZAHL_RS="12" AUFARB="" DATEINAME="CW4122Y20160705221626" FHM="K000003508191" GANGRICHTUNG="V" GERAET="CW4" IDENT_ART="F" MATERIALNUMMER="" MESSDATUM="20160705" MESSZEIT="221626" PARKNR="" SERIALNUMMER="" TAG_FAHRZEUG="" TAG_RADSATZ="" TPLNR="94800442311-7" URMASS="" WERK="122Y"/>
<tns:position EINBAUORT="01" LFDNR="1">
<tns:komponente TYP="Radscheibe links">
<tns:merkmal MESSWERT="28,6" SORTFELD="SH"/>
<tns:merkmal MESSWERT="29,9" SORTFELD="SD"/>
<tns:merkmal MESSWERT="10,5" SORTFELD="QR"/>
<tns:merkmal MESSWERT="136,8" SORTFELD="BR"/>
<tns:merkmal MESSWERT="0,0" SORTFELD="HHY"/>
</tns:komponente>
<tns:komponente TYP="Radscheibe rechts">
<tns:merkmal MESSWERT="28,8" SORTFELD="SH"/>
<tns:merkmal MESSWERT="30,0" SORTFELD="SD"/>
<tns:merkmal MESSWERT="11,0" SORTFELD="QR"/>
<tns:merkmal MESSWERT="136,5" SORTFELD="BR"/>
<tns:merkmal MESSWERT="0,0" SORTFELD="HHY"/>
</tns:komponente>
<tns:komponente TYP="Radsatz">
<tns:merkmal MESSWERT="1361,2" SORTFELD="AR"/>
</tns:komponente>
<tns:komponente TYP="Radsatz">
<tns:merkmal MESSWERT="1421,2" SORTFELD="SR"/>
</tns:komponente>
</tns:position>
</tns:telegramm>
</urn:XML>
然而XmlBeans
转换会为每个子节点写soapenv
和tns
,如下所示:
<urn:XML><tns:telegramm TITLE="Universelle Messtelegramme" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="tns">
<tns:header ANGELEGT_AM="20160705" ANGELEGT_UM="221626" ANGELEGT_VON="ub2" ANZAHL_RS="12" AUFARB="" DATEINAME="CW4122Y20160705221626" FHM="K000003508191" GANGRICHTUNG="V" GERAET="CW4" IDENT_ART="F" MATERIALNUMMER="" MESSDATUM="20160705" MESSZEIT="221626" PARKNR="" SERIALNUMMER="" TAG_FAHRZEUG="" TAG_RADSATZ="" TPLNR="94800442311-7" URMASS="" WERK="122Y" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="tns"/>
<tns:position EINBAUORT="01" LFDNR="1" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="tns">
...
搜索网页并阅读apache documentation我无法找到有关此方案的任何信息,以便在已在根网站上声明时从子节点删除命名空间。
答案 0 :(得分:0)
您是否尝试过设置XmlOptions setAggressiveNamespaces()
使保护程序减少名称空间前缀声明的数量。保护程序将通过两次传递文档来完成此操作,首先是收集所需的命名空间声明集,然后是第二次使用在根目录中收集的声明来保存文档。
和/或setSaveSuggestedPrefixes()
带有命名空间的散列图?
如果已经在保存的片段范围之外声明了名称空间,则允许将这些映射传递给保护程序,因此不会重新声明前缀。
HashMap NamespaceMap = new HashMap();
NamespaceMap.put("http://schemas.xmlsoap.org/soap/envelope/", "soapenv");
NamespaceMap.put("tns", "tns");
XmlOptions xmlOptions = new XmlOptions();
xmlOptions.setSavePrettyPrint();
xmlOptions.setSaveSuggestedPrefixes(NamespaceMap);
xmlOptions.setSaveAggressiveNamespaces();
xmlOptions.setUseDefaultNamespace();
try {
docObject.save(xmlFile, xmlOptions);
} catch (IOException e) {
e.printStackTrace();
}