Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring mvc 如何从使用JAXB生成的XML中删除默认根元素名称空间前缀_Spring Mvc_Jaxb - Fatal编程技术网

Spring mvc 如何从使用JAXB生成的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

我正在使用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.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中的根元素名称中去掉前缀。。。