Tôi đang cố gắng để xử lý một số file XML bằng cách sử dụng thực hiện JAXB vận chuyển trong Java 7. Tôi đang sử dụng các phiên bản này:JAXB xử lý chuỗi XML
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)
Các decalaration có vấn đề trong lược đồ XML như sau :
<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>
Như bạn có thể thấy, có hai lần xuất hiện rõ ràng của se: Giá trị trong Loại. Tuy nhiên, nó không dừng việc biên dịch bằng cách sử dụng xjc. Và nếu tôi có một cái nhìn trong lớp Java được tạo ra cho loại hình này, tôi có thể thấy rằng nó là theoritically thể lấy các yếu tố của
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="se:Threshold"/>
<xsd:element ref="se:Value"/>
</xsd:sequence>
sử dụng phương pháp sau đây:
public List<Object> getThresholdAndValue() {
if (thresholdAndValue == null) {
thresholdAndValue = new ArrayList<Object>();
}
return this.thresholdAndValue;
}
Thật không may, nếu tôi cố gắng để có được các yếu tố của danh sách, tôi chỉ có thể lấy các yếu tố đăng ký là ngưỡng trong file xml của tôi, nơi dụ CategorizeType được định nghĩa như sau:
<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>
Wh vi truy xuất danh sách, tôi chỉ có thể thấy giá trị Ngưỡng.
Tôi có làm gì sai không? Nó là một giới hạn bên trong của Jaxb?
Lưu ý rằng tôi không thể thay đổi lược đồ XML ...
EDIT:
Tôi đã chỉ cần chạy XJC với các tùy chọn -v, và tôi có được trên toàn cầu đầu ra tương tự. Với tính cách rườm rà:
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
Nếu không có nó:
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...
Các đầu ra sau đây chỉ chứa tên và vị trí của các tập tin được tạo ra.
Tôi đã quên nói rằng xsd này không thể được biên dịch với xjc được gửi đi với Java 6. Lần thử cuối cùng đã được thực hiện với JAXB 2.1.10. Tôi không thể tạo lại hành vi này ngay bây giờ, như tôi bây giờ làm việc với Java 7.
EDIT2:
Tôi vừa cố gắng tùy chỉnh các bingind, như được đề xuất trong các nhận xét. tập ràng buộc của tôi là như sau:
<?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>
Thể hiện giá trị đầu tiên thực sự là thay thế bằng một thuộc tính firstValue trong mã 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;
}
Thật không may, tôi vẫn có được kết quả tương tự - Tôi vẫn không thể xem giá trị của tôi trong danh sách được trả về bởi getThresholdAndValues (). Tôi vẫn đang tìm hiểu cách tùy biến ...
Các chú thích trên phương thức 'getThresholdAndValue' là gì? Đó là phần thú vị, không phải là thân phương pháp. – skaffman
Không có. Các chú thích duy nhất tôi có thể tìm thấy trong lớp này được đặt trên lớp và trên các thuộc tính của nó. Không ai trong số họ được thiết lập trên một phương pháp ... – Agemen
Vấn đề thú vị - xin vui lòng bạn có thể đăng lược đồ đầy đủ? – davidfrancis