使用Jaxb添加Xml命名空间

时间:2010-02-24 00:49:55

标签: java namespaces jaxb amazon-web-services

我正在创建亚马逊饲料,饲料xml应该像:

<AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">

我使用jaxb从java类生成xml文件,我使用jaxb示例中的NamespacePrefixMapperImpl将命名空间添加到xml中。但目前它生成的根目录如下:

<AmazonEnvelope xmlns:xsi:noNamespaceSchemaLocation="amzn-envelope.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

如何从amzn-envelope.xsd ??

中删除xmlns

这是我在NamespacePrefixMapperImpl

中使用的映射
if( "http://www.w3.org/2001/XMLSchema-instance".equals(namespaceUri) )
    return "xsi";

if("amzn-envelope.xsd".equals(namespaceUri))
    return "xsi:noNamespaceSchemaLocation";

2 个答案:

答案 0 :(得分:3)

我在Marshaller找到了一个可以添加amzn-envelope.xsd:

的属性
marshaller.setProperty("jaxb.noNamespaceSchemaLocation", "amzn-envelope.xsd");

并离开NamespacePrefixMapper以添加“http://www.w3.org/2001/XMLSchema-instance”。 希望这有助于其他人。

答案 1 :(得分:0)

如果我理解你的意图,你的文档有一个默认的命名空间,而你正在尝试为该命名空间添加schemalLocation

NamespacePrefixMapper不允许您这样做,它仅对选择命名空间的前缀很有用。本文档中没有名称空间,因此没有使用NamespacePrefixMapper的有用方法。它不能用于添加schemaLocation提示 - 这些提示由JAXB专门处理,你只是混淆它。

您确定需要noNamespaceSchemaLocation="amzn-envelope.xsd"吗?您是否尝试在没有它的情况下将其发送到Web服务?