Spring mvc 如何从使用JAXB生成的XML中删除默认根元素名称空间前缀
我正在使用JAXB和SpringMVC框架来生成XML。这是根元素的示例:Spring mvc 如何从使用JAXB生成的XML中删除默认根元素名称空间前缀,spring-mvc,jaxb,Spring Mvc,Jaxb,我正在使用JAXB和SpringMVC框架来生成XML。这是根元素的示例: <ns2:urlset xmlns:ns2="http://www.example.com"> 我尝试使用以下package info.java删除默认前缀ns2 @javax.xml.bind.annotation.XmlSchema( namespace = "http://www.example.com", xmlns = {@javax.xml.bind.annotatio
<ns2:urlset xmlns:ns2="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
值设置为“”来删除前缀。它仍然显示默认值ns2
。是否有办法删除默认前缀ns2
另一个问题是,如果XML标题中的standalone
属性也可以删除?如果是,可以通过package info.java
完成吗
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
试试这个:
package-info.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 {...}
如果不起作用,您可能在JAXB的参考实现中发现了一个bug(至少,我认为是一个bug)。我也遇到了同样的问题——如果我向模型类添加了一个JaxbElement,JAXB RI就会开始忽略我的默认名称空间。除了切换到EclipseMoxy(没有任何其他的修改)之外,我找不到其他解决方案,它成功了。(注意:在moxy中要小心)
对于第二个问题,请使用以下内容:
JAXBContext jc = JAXBContext.newInstance(...);
Marshaller m = jc.createMarshaler();
m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
每个Java对象和其中的嵌套字段(将作为XML元素写入)都有一个与其关联的命名空间。如果封送拆收器在要封送的对象树中检测到多个命名空间,它将添加适当的命名空间前缀以消除封送XML中的歧义 以下讨论适用于Java1.6及以上版本
类的实例
@XmlRootElement(name = "Message")
class Message {
@XmlAttribute(name = "Version")
public int getVersion() { return 1; }
}
@XmlRootElement(name = "Message", namespace = "http://example.com/schema/message")
class Message {
@XmlAttribute(name = "Version")
public int getVersion() { return 1; }
}
@XmlRootElement(name = "Message", namespace = "http://example.com/schema/message")
class Message {
@XmlElement(name = "Version")
public int getVersion() { return 1; }
}
@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; }
}
将序列化为:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Message Version="1"/>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Message xmlns="http://example.com/schema/message" Version="1"/>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:Message xmlns:ns2="http://example.com/schema/message">
<Version>1</Version>
</ns2:Message>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:Message xmlns:ns2="http://example.com/schema/message">
<Version>1</Version>
</ns2:Message>
(添加到@XmlRootElement
)的自定义命名空间将被序列化为:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Message Version="1"/>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Message xmlns="http://example.com/schema/message" Version="1"/>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:Message xmlns:ns2="http://example.com/schema/message">
<Version>1</Version>
</ns2:Message>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:Message xmlns:ns2="http://example.com/schema/message">
<Version>1</Version>
</ns2:Message>
(@xmldattribute
更改为@xmlement
)将被序列化为:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Message Version="1"/>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Message xmlns="http://example.com/schema/message" Version="1"/>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:Message xmlns:ns2="http://example.com/schema/message">
<Version>1</Version>
</ns2:Message>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:Message xmlns:ns2="http://example.com/schema/message">
<Version>1</Version>
</ns2:Message>
(添加到@xmlement
)的自定义命名空间将被序列化为:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Message Version="1"/>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Message xmlns="http://example.com/schema/message" Version="1"/>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:Message xmlns:ns2="http://example.com/schema/message">
<Version>1</Version>
</ns2:Message>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:Message xmlns:ns2="http://example.com/schema/message">
<Version>1</Version>
</ns2:Message>
1.
因为尽管XML消息有两个元素(
message
和Version
),但它们共享相同的名称空间(http://example.com/schema/message
)。因此,在决定每个元素所属的名称空间时不再存在任何歧义,因此,在生成的XML中只有一个名称空间声明。我相信可能存在错误。但我在2019年写了这篇文章,当时java被认为是编程语言之神。如何从生成的xml中的根元素名称中去掉前缀。。。