java – Jaxb:在同一个包中解组带有多个名称空间的xml
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – Jaxb:在同一个包中解组带有多个名称空间的xml,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5018字,纯文字阅读大概需要8分钟。
内容图文
![java – Jaxb:在同一个包中解组带有多个名称空间的xml](/upload/InfoBanner/zyjiaocheng/701/d0c616f65aba4189aeef59864425eea0.jpg)
我是新手在xml中使用命名空间所以我有点困惑,想要一些澄清.我有一个java服务,我接收带有许多不同名称空间的xml文档,当我使用它时,我觉得我必须做错了所以我想检查.在我的package-info.java中,我有我的模式注释,例如:
@javax.xml.bind.annotation.XmlSchema(
xmlns={
@javax.xml.bind.annotation.XmHS(prefix="train", namespaceURI="http://mycompany/train"),
@javax.xml.bind.annotation.XmHS(prefix="passenger", namespaceURI="http://mycompany/passenger")
},
elementFormDefault = javax.xml.bind.annotation.XmlNsForm=QUALIFIED
)
我在类级别上有一个Train.java注释:
@XmlRootElement(name="Train", namespace="http://mycompany/train")
并且类中的每个字段都注释为:
@XmlElement(name="Color") for example
火车包含一个乘客名单,所以有一个属性
private Set<Passenger> passengers;
此集合注释为:
@XmlElementWrapper(name="Passengers")
@XmlElements(@XmlElement(name="Passenger", namespace="http://mycompany/passenger"))
然后在Passenger.java中,类本身注释为:
@XmlElement(name="Passenger", namespace="http://mycompany/passenger")
最后,对于Passenger.java中的各个字段,它们的注释如下:
@XmlElement(name="TicketNumber", namespace="http://mycompany/passenger")
所以,当我有一个看起来像这样的xml:
<train:Train>
<train:Color>Red</train:Color>
<train:Passengers>
<train:Passenger>
<passenger:TicketNumber>T101</passenger:TicketNumber>
</train:Passenger>
</train:Passengers>
</train:Train>
现在我解组我收到的这个xml并设置了Train的Color属性并设置了Passenger的TicketNumber属性.但是我不知道为什么我需要在TicketNumber上的XmlElement注释上添加名称空间url才能使用它,但我不需要为Train上的Color属性执行此操作.如果我从TicketNumber上的XmlElement注释中删除namespace属性,则xml中的值将不会映射到该对象,除非我还从xml请求中删除了名称空间前缀.我觉得因为我已经在XmlRootElement for Passenger上定义了namespace属性,所以我不应该为类中的每个字段都这样做,就像我没有为Train一样,所以我假设我必须设置错误.有人能指出我正确的方向吗?谢谢!
解决方法:
下面根据您的模型解释命名空间如何在JAXB (JSR-222)中工作.
JAVA模型
包信息
以下是@XmlSchema注释的修改版本.它包含一些关键信息:
> namespace – 将用于限定全局元素的默认命名空间(对应于未指定其他命名空间的@XmlRootElement和@XmlElementDecl注释(以及基于elementFormDefault值的本地元素).
> elementFormDefault默认情况下只有全局元素是名称空间限定的,但是通过将值设置为XmlNsForm.QUALIFIED,所有没有指定显式名称空间的元素都将使用名称空间值进行限定.
> xmlns是JAXB impl应该用于这些命名空间的首选前缀集(尽管它们可能使用其他前缀).
@XmlSchema(
namespace="http://mycompany/train",
elementFormDefault = XmlNsForm.QUALIFIED,
xmlns={
@XmlNs(prefix="train", namespaceURI="http://mycompany/train"),
@XmlNs(prefix="passenger", namespaceURI="http://mycompany/passenger")
}
)
package forum15772478;
import javax.xml.bind.annotation.*;
培养
由于与Train类对应的所有元素都对应于@XmlSchema注释中指定的命名空间,因此我们不需要指定任何命名空间信息.
>全局元素 – @XmlRootElement注释对应于全局元素.
>本地元素 – @XmlElementWrapper和@XmlElement注释对应于本地元素.
package forum15772478;
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement(name="Train")
public class Train {
private List<Passenger> passengers;
@XmlElementWrapper(name="Passengers")
@XmlElement(name="Passenger")
public List<Passenger> getPassengers() {
return passengers;
}
public void setPassengers(List<Passenger> passengers) {
this.passengers = passengers;
}
}
乘客
如果与Passenger类上的属性对应的所有元素都位于http:// mycompany / passenger命名空间中,则可以使用@XmlType批注从@XmlSchema批注覆盖命名空间.
package forum15772478;
import javax.xml.bind.annotation.*;
@XmlType(namespace="http://mycompany/passenger")
public class Passenger {
private String ticketNumber;
@XmlElement(name="TicketNumber")
public String getTicketNumber() {
return ticketNumber;
}
public void setTicketNumber(String ticketNumber) {
this.ticketNumber = ticketNumber;
}
}
或者,您可以在属性级别覆盖命名空间.
package forum15772478;
import javax.xml.bind.annotation.*;
public class Passenger {
private String ticketNumber;
@XmlElement(
namespace="http://mycompany/passenger",
name="TicketNumber")
public String getTicketNumber() {
return ticketNumber;
}
public void setTicketNumber(String ticketNumber) {
this.ticketNumber = ticketNumber;
}
}
演示代码
可以运行以下演示代码来证明一切正常:
演示
package forum15772478;
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Train.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum15772478/input.xml");
Train train = (Train) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(train, System.out);
}
}
input.xml中/输出
在下面的XML中,我添加了问题中XML文档中缺少的必要命名空间声明.
<train:Train
xmlns:train="http://mycompany/train"
xmlns:passenger="http://mycompany/passenger">
<train:Color>Red</train:Color>
<train:Passengers>
<train:Passenger>
<passenger:TicketNumber>T101</passenger:TicketNumber>
</train:Passenger>
</train:Passengers>
</train:Train>
欲获得更多信息
> http://blog.bdoughan.com/2010/08/jaxb-namespaces.html
内容总结
以上是互联网集市为您收集整理的java – Jaxb:在同一个包中解组带有多个名称空间的xml全部内容,希望文章能够帮你解决java – Jaxb:在同一个包中解组带有多个名称空间的xml所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。