如何将命名空间定义从根元素移动到 JAXB 中的特定子元素?

问题描述 投票:0回答:1

我正在开发一个 Java 应用程序,它使用 JAXB 将 Java 对象编组到 XML 中。目前,生成的 XML 如下所示:

<A xmlns="A" xmlns:ns2="B" xmlns:ns3="C">
<t1>content</t1>
<t2>
    <ns2:t3>
        <ns2:t4>content2</ns2:t4>           
    </ns2:t3>       
</t2>
</A>

命名空间定义放置在根标签“A”中。而且,某些命名空间(例如“C”)甚至没有被使用。我想将命名空间定义放置在内部子级中代替前缀。例如,我想获取以下xml:

<A xmlns="A">
<t1>content</t1>
<t2 xmlns:ns2="B">
    <t3>
        <t4>content2</t4>           
    </t3>       
</t2>
</A>

这两个 xml 都是有效的,但我需要生成第二个输出才能通过第三方应用程序的验证。

我怎样才能实现这个目标?

谢谢你。

java xml namespaces jaxb marshalling
1个回答
0
投票

请注意,

xmlns:name="..."
仅将命名空间与前缀相关联。具有此前缀的任何元素都将属于关联的命名空间。没有前缀的元素属于默认命名空间。

因此...

  • 在您的第一个示例中,从未使用命名空间 C。
  • 在第二个示例中,使用的唯一命名空间是默认命名空间,因为两个元素都没有前缀。

除此之外,将命名空间声明放在哪里并不重要,只要在需要时声明它们即可。

<A xmlns="A" xmlns:ns2="B">
<t1>content</t1>
<t2>
    <ns2:t3>
        <ns2:t4>content2</ns2:t4>           
    </ns2:t3>       
</t2>
</A>

相当于

<A xmlns="A">
<t1>content</t1>
<t2>
    <ns2:t3 xmlns:ns2="B">
        <ns2:t4>content2</ns2:t4>           
    </ns2:t3>       
</t2>
</A>

使用 JAXB 时,您必须使用 XmlElement 注释定义命名空间:

@XmlElement(name = "t3", namespace = "B")
protected T3 t3;

对应属于此命名空间的任何其他元素重复此操作。

© www.soinside.com 2019 - 2024. All rights reserved.