我嘗試過程中使用出貨的Java 7的JAXB實現我使用這些版本的一些XML文件:JAXB處理
501 ~ % xjc -version
xjc 2.2.4
502 ~ %java -version
java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) Server VM (build 21.1-b02, mixed mode)
XML架構的問題decalaration如下:
<xsd:complexType name="CategorizeType">
<xsd:complexContent>
<xsd:extension base="se:FunctionType">
<xsd:sequence>
<xsd:element ref="se:LookupValue"/>
<xsd:element ref="se:Value"/>
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="se:Threshold"/>
<xsd:element ref="se:Value"/>
</xsd:sequence>
<xsd:element ref="se:Extension" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="thresholdBelongsTo"
type="se:ThresholdBelongsToType" use="optional"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
正如你所看到的,se有兩個顯式的出現:Type中的Value。但是,它不會停止使用xjc編譯。如果我有這種類型生成的Java類一看,我可以看到,它是theoritically可以使用以下方法來檢索的
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="se:Threshold"/>
<xsd:element ref="se:Value"/>
</xsd:sequence>
元素:
public List<Object> getThresholdAndValue() {
if (thresholdAndValue == null) {
thresholdAndValue = new ArrayList<Object>();
}
return this.thresholdAndValue;
}
不幸的是,如果我試圖讓列表的元素,我只能取回我的XML文件,其中CategorizeType實例定義如下注冊門檻的元素:
<Categorize thresholdsBelongTo="succeeding" fallbackValue="0">
<LookupValue>
<ns3:ValueReference>OUI_EEE92</ns3:ValueReference>
</LookupValue>
<Value>0.3</Value>
<Threshold>30.0</Threshold>
<Value>0.4</Value>
<Threshold>40.0</Threshold>
<Value>0.45</Value>
<Threshold>45.0</Threshold>
<Value>0.5</Value>
<Threshold>50.0</Threshold>
<Value>0.55</Value>
<Threshold>55.0</Threshold>
<Value>0.6</Value>
<Threshold>60.0</Threshold>
<Value>0.7</Value>
<Threshold>70.0</Threshold>
<Value>0.8</Value>
<Extension>
<ExtensionParameter name="method">MANUAL</ExtensionParameter>
</Extension>
</Categorize>
瓦在檢索列表中,我只能看到閾值。
我做錯了什麼?它是Jaxb的內在侷限性嗎?
請注意,我不能改變的XML架構...
編輯:
我剛剛與-v選項運行XJC,我在全球獲得相同的輸出。隨着冗長:
xjc -verbose se/2.0/All.xsd
parsing a schema...
[WARNING] java.net.SocketException: Unexpected end of file from server
line 23 of file:/home/alexis/crap/SE-Schema-2.0/ows/2.0/ows19115subset.xsd
[WARNING] java.net.SocketException: Unexpected end of file from server
line 22 of file:/home/alexis/crap/SE-Schema-2.0/filter/2.0/filterCapabilities.xsd
compiling a schema...
[INFO] generating codee
unknown location
沒有它:
xjc se/2.0/All.xsd
parsing a schema...
[WARNING] java.net.SocketException: Unexpected end of file from server
line 23 of file:/home/alexis/crap/SE-Schema-2.0/ows/2.0/ows19115subset.xsd
[WARNING] java.net.SocketException: Unexpected end of file from server
line 22 of file:/home/alexis/crap/SE-Schema-2.0/ows/2.0/owsExceptionReport.xsd
compiling a schema...
下面的輸出只包含生成的文件的名稱和位置。
我忘了說這個xsd無法與隨Java 6提供的xjc一起編譯。最後嘗試過使用JAXB 2.1.10。現在我無法再現此行爲,因爲我現在使用Java 7的工作
EDIT2:
我只是嘗試自訂binginds,在意見提出。我綁定文件如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jxb:bindings jxb:version="1.0"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
<jxb:bindings schemaLocation="schema.xsd"
node="//xsd:complexType[@name='CategorizeType']">
<jxb:bindings
node="xsd:complexContent/xsd:extension/xsd:sequence/xsd:element[@ref='se:Value'][position()=1]">
<jxb:property name="FirstValue"/>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
的第一個值實例是由firstValue屬性在Java代碼中的確更換
@XmlElement(name = "Value", required = true)
protected ParameterValueType firstValue;
@XmlElements({
@XmlElement(name = "Threshold", type = LiteralType.class),
@XmlElement(name = "Value", type = ParameterValueType.class)
})
protected List<Object> thresholdAndValue;
public ParameterValueType getFirstValue() {
return firstValue;
}
public void setFirstValue(ParameterValueType value) {
this.firstValue = value;
}
public List<Object> getThresholdAndValue() {
if (thresholdAndValue == null) {
thresholdAndValue = new ArrayList<Object>();
}
return this.thresholdAndValue;
}
不幸的是,我仍然能獲得同樣的結果 - 我仍然不能在由getThresholdAndValues()返回的列表中查看我的值。我還在探索定製的方式...
getThresholdAndValue方法的註釋是什麼?這是有趣的部分,而不是方法體。 – skaffman
無。我可以在課堂上找到唯一的註釋,並在課堂上和屬性上進行設置。他們都沒有設置方法... – Agemen
有趣的問題 - 請你可以發佈完整的模式? – davidfrancis