我是新手在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
)
Run Code Online (Sandbox Code Playgroud)
我在类级别上有一个Train.java注释:
@XmlRootElement(name="Train", namespace="http://mycompany/train")
Run Code Online (Sandbox Code Playgroud)
并且类中的每个字段都注释为:
@XmlElement(name="Color") for example
Run Code Online (Sandbox Code Playgroud)
火车包含一个乘客名单,所以有一个属性
private Set<Passenger> passengers;
Run Code Online (Sandbox Code Playgroud)
此集合注释为:
@XmlElementWrapper(name="Passengers")
@XmlElements(@XmlElement(name="Passenger", namespace="http://mycompany/passenger"))
Run Code Online (Sandbox Code Playgroud)
然后在Passenger.java中,类本身注释为:
@XmlElement(name="Passenger", namespace="http://mycompany/passenger")
Run Code Online (Sandbox Code Playgroud)
最后,对于Passenger.java中的各个字段,它们的注释如下:
@XmlElement(name="TicketNumber", namespace="http://mycompany/passenger")
Run Code Online (Sandbox Code Playgroud)
所以,当我有一个看起来像这样的xml:
<train:Train>
<train:Color>Red</train:Color>
<train:Passengers>
<train:Passenger>
<passenger:TicketNumber>T101</passenger:TicketNumber>
</train:Passenger>
</train:Passengers>
</train:Train>
Run Code Online (Sandbox Code Playgroud)
现在我解组我收到的这个xml并设置了Train的Color属性并设置了Passenger的TicketNumber属性.但是我不知道为什么我需要在TicketNumber上的XmlElement注释上添加名称空间url才能工作,但我不需要为Train上的Color属性这样做.如果我从TicketNumber上的XmlElement注释中删除namespace属性,则xml中的值不会映射到该对象,除非我还从xml请求中删除了名称空间前缀.我觉得因为我已经在XmlRootElement for Passenger上定义了namespace属性,所以我不应该为类中的每个字段都这样做,就像我没有为Train一样,所以我假设我必须设置错误.有人能指出我正确的方向吗?谢谢!
在Java项目中,我使用jax-ws和wsdl创建了一个Web服务客户端.该请求是有效的xml,但缺少此特定soap调用所需的前缀.目前我通过手动将xmlns = {@ javax.xml.bind.annotation.XmlNs(prefix ="gen",namespaceURI ="http:// schemas ...")})添加到package-info.java类来解决这个问题.但是觉得这不是最好的解决方案,因为package-info是自动创建的,如果由于任何原因再次生成源,我的解决方案将被覆盖.
我怀疑我的wsdl中缺少一些东西.
这是wsdl:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:tns="http://xmlns.example.com/1308658932768" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns0="http://schemas.triennium.com/Servicepunt/gen" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" name="Untitled" targetNamespace="http://xmlns.example.com/1308658932768">
<wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://schemas.triennium.com/Servicepunt/gen"
targetNamespace="http://schemas.triennium.com/Servicepunt/gen"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:element name="CallInfo">
<xs:complexType>
...
</xs:complexType>
</xs:element>
<xs:element name="ResponseStatus">
<xs:complexType>
...
</xs:complexType>
</xs:element>
<xs:element name="Credentials">
<xs:complexType>
...
</xs:complexType>
</xs:element>
<xs:element name="AuthenticateAannemerRequest">
<xs:complexType>
...
</xs:complexType>
</xs:element>
<xs:element name="AuthenticateAannemerResponse">
<xs:complexType>
...
</xs:complexType>
</xs:element>
</xs:schema>
</wsdl:types>
<wsdl:service name="WSDL_Generator.2.0.2">
<wsdl:port name="AuthenticateAannemer.2.0.2" binding="tns:AuthenticateAannemer.2.0.2Binding">
<soap:address location="http://10.11.2.12:2592"/>
</wsdl:port>
</wsdl:service>
<wsdl:portType name="AuthenticateAannemer">
<wsdl:operation name="AuthenticateAannemer">
<wsdl:input message="tns:AuthenticateAannemerRequest"/>
<wsdl:output message="tns:AuthenticateAannemerResponse"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="AuthenticateAannemer.2.0.2Binding" …Run Code Online (Sandbox Code Playgroud)