JAXB:使用属性编组对象会为xml重新声明名称空间

时间:2013-03-13 15:17:01

标签: jaxb marshalling xml-namespaces

我有这个xml:

<tag1 xmlns="myNamespace.com/#">
    <insideTag myAttribute="5">
        some text
    </insideTag>
</tag1>

但在编组之后就变成了这个:

<tag1 xmlns="myNamespace.com">
    <insideTag xmlns:ns1="myNamespace.com/#" xmlns="" myAttribute="5">
        some text
    </insideTag>
</tag1>

我知道,它几乎相同,但我真的需要xml就像第一个。

我没有这个xml的xsd。实际上,xml被解析为org.w3c.dom.Element,在ObjectType(下面的xsd和类简化实现)中添加,然后这个ObjectType被编组。
如果这很重要,我使用的是NamespacePrefixMapper。 xsd(注意未设置attributeFormDefault)

<schema xmlns="http://www.w3.org/2001/XMLSchema" version="0.1"
  xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
  targetNamespace="http://www.w3.org/2000/09/xmldsig#"
  elementFormDefault="qualified">

    <complexType name="ObjectType" mixed="true">
        <sequence minOccurs="0" maxOccurs="unbounded">
            <any namespace="##any" processContents="lax"/>
        </sequence>
    </complexType>
</schema>

类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ObjectType", namespace = "http://www.w3.org/2000/09/xmldsig#",
   propOrder = { "content" })
public class ObjectType{
    @XmlMixed
    @XmlAnyElement(lax = true)
    protected List<Object> content;

    public List<Object> getContent() {
        if (content == null) {
            content = new ArrayList<Object>();
        }
        return this.content;
    }
}

所以......有人知道如何解决这个问题吗? 顺便说一句......解决方案也必须与jaxb-impl-2.1.4一起使用。

感谢所有人的帮助。

1 个答案:

答案 0 :(得分:0)

为了避免不必要的namespase,你需要在ObjectFactory类注册,如下所示:

@XmlElementDecl(name="CurrencyPayTypeCode") 
public JAXBElement<OLILUMEASUNITS> createCurrencyPayTypeCode(OLILUMEASUNITS elem) {
                return new JAXBElement<OLILUMEASUNITS>(new QName("OLILUMEASUNITS"), OLILUMEASUNITS.class, elem); 
}

其中:

  1. CurrencyPayTypeCode - insideTag的名称
  2. OLILUMEASUNITS - 可以标记解组的类