我正在尝试在解组时删除名称空间前缀,我可以通过设置marshaller属性来使用PrefixMapper更改名称空间。默认命名空间是ns2,我不想要任何前缀,但它不允许我给出空前缀值。如果我给出如下的空字符串,它将采用默认值。
1)jaxbMarshaller.setProperty(“com.sun.xml.internal.bind.namespacePrefixMapper”,new MyNamespaceMapper()); .....
class MyNamespaceMapper extends NamespacePrefixMapper {
private static final String URI = "http://www.examples/webservice/";
@Override
public String getPreferredPrefix(String namespaceUri, String suggestion,
boolean requirePrefix) {
if(URI.equals(namespaceUri)) {
return "";
}
return suggestion;
}
}
2)如果我编辑package-info如下所示它很好,但问题是我正在创建一个JAXB整数元素,如下所示,前缀删除不适用于这些元素
JAXBElement<Integer> jaxBInteger = new JAXBElement<Integer>(
new QName("http://www.example.com/", "age",""),30);
pax.setAge(jaxBInteger);
<Login Password="" Email=""/>
<Paxes>
<Pax IdPax="1">
<ns2:Age>30</ns2:Age>
</Pax>
<Pax IdPax="2">
<ns2:Age>30</ns2:Age>
</Pax>
</Paxes>
</Login>
答案 0 :(得分:0)
是将前缀替换为“空”似乎非常棘手,因为你可以在这里看到我的question。我确实找到了在生成XML之后使用xslt进行转换的解决方案,如下所示。希望它有所帮助。
<强> removenamespace.xslt 强>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:preserve-space elements="*"/>
<xsl:template match="@*|node()[not(self::*)]">
<xsl:copy />
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="node()|@*" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
XSLT转换器
File outputXML = new File(inputXML.getParentFile(), inputXML.getName() + "-ns.xml");
try{
TransformerFactory factory = TransformerFactory.newInstance();
Source xslt = new StreamSource(new File(REMOVE_NAMESPACE_XSL));
Transformer transformer = factory.newTransformer(xslt);
Source text = new StreamSource(inputXML);
transformer.transform(text, new StreamResult(outputXML));
}
catch(Exception e){
// something gone wrong. return original XML.
return inputXML;
}