6

我正在使用带有 spring-mvc 框架的 JAXB 来生成 XML。这是根元素的示例:

<ns2:urlset xmlns:ns2="http://www.example.com">

但是,这就是我想要的(没有 XML 命名空间前缀ns2):

<urlset xmlns="http://www.example.com">

我尝试使用以下package-info.java方法删除默认前缀ns2

@javax.xml.bind.annotation.XmlSchema(  
    namespace = "http://www.example.com",   
    xmlns = {@javax.xml.bind.annotation.XmlNs(namespaceURI = "http://www.example.com", prefix="")},  
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED)  
package com.example.code

ns2如果我设置prefix为另一个字符串,则前缀可以更改为其他值(比)。但是不能通过将prefix值设置为“”来删除前缀。它仍然显示默认值ns2。有没有办法删除默认前缀ns2

另一个问题是,是否standalone也可以删除 XML 标头中的属性?如果可以,可以通过package-info.java吗?

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
4

3 回答 3

2

尝试这个:

包信息.java

    @XmlSchema(
    namespace="http://www.sitemaps.org/schemas/sitemap/0.9", 
    elementFormDefault=XmlNsForm.QUALIFIED)
package com.example.model;
import javax.xml.bind.annotation.XmlSchema;
import javax.xml.bind.annotation.XmlNsForm;

XmlUrlSet.java

@XmlAccessorType(value = XmlAccessType.NONE)
@XmlRootElement(name = "urlset", namespace = "http://www.sitemaps.org/schemas/sitemap/0.9")
public class XmlUrlSet {...}
于 2012-11-20T22:38:08.520 回答
1

如果@alex 的回答不起作用,您可能在 JAXB 的参考实现中发现了一个错误(至少,我认为它是一个错误)。我只是遇到了同样的问题——如果我在我的模型类中添加了一个 JaxbElement,那么 JAXB RI 开始忽略我的默认命名空间。除了切换到 Eclipse MOXy(没有任何其他修改)之外,我找不到其他解决方案,并且它有效。(注意:注意 moxy 中的另一个错误

同样对于您的第二个问题,请使用以下命令:

JAXBContext jc = JAXBContext.newInstance(...);
Marshaller m = jc.createMarshaler();
m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
于 2012-12-04T15:47:12.910 回答
0

每个将被编写为 XML 元素的 Java 对象和其中的嵌套字段都有一个与之关联的名称空间。如果编组器在被编组的对象树中检测到多个名称空间,它将添加适当的名称空间前缀以在编组的 XML 中消除它们的歧义。

以下讨论适用于 Java 1.6 及更高版本。

示例 1


类的实例

@XmlRootElement(name = "Message")
class Message {
  @XmlAttribute(name = "Version")
  public int getVersion() { return 1; }
}

将被序列化为:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Message Version="1"/>

因为 XML 消息只有一个元素 ( Message),并带有默认命名空间 ( "")。

示例 2


类的实例

@XmlRootElement(name = "Message", namespace = "http://example.com/schema/message")
class Message {
  @XmlAttribute(name = "Version")
  public int getVersion() { return 1; }
}

(添加到的自定义命名空间@XmlRootElement)将被序列化为:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Message xmlns="http://example.com/schema/message" Version="1"/>

因为 XML 消息仍然只有一个元素 ( Message),尽管使用自定义名称空间 ( http://example.com/schema/message) 而不是默认名称空间。

示例 3


类的实例

@XmlRootElement(name = "Message", namespace = "http://example.com/schema/message")
class Message {
  @XmlElement(name = "Version")
  public int getVersion() { return 1; }
}

(@XmlAttribute改为@XmlElement) 将被序列化为:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:Message xmlns:ns2="http://example.com/schema/message">
    <Version>1</Version>
</ns2:Message>

因为 XML 消息现在有两个元素(MessageVersion),具有不同的名称空间(http://example.com/schema/message""分别)。因此,编组器被迫通过它们自己的名称空间来消除这两个元素的歧义。

示例 4

类的实例

@XmlRootElement(name = "Message", namespace = "http://example.com/schema/message")
class Message {
  @XmlElement(name = "Version", namespace = "http://example.com/schema/message")
  public int getVersion() { return 1; }
}

(添加到的自定义命名空间@XmlElement)将被序列化为:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:Message xmlns:ns2="http://example.com/schema/message">
    <Version>1</Version>
</ns2:Message>

因为虽然 XML 消息有两个元素(MessageVersion),但它们共享相同的命名空间(http://example.com/schema/message)。因此,在确定每个元素属于哪个名称空间时不再有任何歧义,因此在生成的 XML 中只有一个名称空间声明。

于 2018-10-04T08:49:53.307 回答