2013-04-12 19 views
5

Sau unmarshalling các tập tin XML, tất cả tài sản mà là các thuộc tính trong file XML có giá trị NULL (fileDateTime, fileId, vv ...)JAXB unmarshal trả về null cho các thuộc tính

Tôi thực sự không hiểu tại sao như tôi có chú thích đúng @XmlAttribute(name = "FileDateTime")@XmlAttribute(name = "FileId")

Như bạn thấy tôi không sử dụng bất kỳ không gian tên (vì vậy không phải là một vấn đề không gian tên tôi nghĩ!)

tôi đang sử dụng JDK 1.6, Sax 2.0.1 và XercesImpl 2.9 .1

Cảm ơn sự giúp đỡ của bạn.

test.xml

<KeyImport_file FileDateTime="2013-05-30T09:00:00" FileId="KeyImport_source_20121231124500"> 
    <!--1 or more repetitions:--> 
    <record record_number="10"> 
    ... 
    </record> 
</KeyImport_file> 

KeyImportFile.java

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "record" 
}) 
@XmlRootElement(name = "KeyImport_file") 
public class KeyImportFile { 

    @XmlElement(required = true) 
    protected List<KeyImportFile.Record> record; 

    @XmlAttribute(name = "FileDateTime") 
    @XmlSchemaType(name = "dateTime") 
    protected XMLGregorianCalendar fileDateTime; 

    @XmlAttribute(name = "FileId") 
    protected String fileId; 
etc... 
etc... 

Phương pháp phân tích cú pháp (unmarshal xác nhận & XSD):

import org.xml.sax.InputSource; 
import org.xml.sax.XMLReader; 

import javax.xml.XMLConstants; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.UnmarshallerHandler; 
import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 
import javax.xml.transform.stream.StreamSource; 
import javax.xml.validation.Schema; 
import javax.xml.validation.SchemaFactory; 
import java.io.InputStream; 

private KeyImportFile parseXML(final InputStream xmlInputStream, final StreamSource xsdSource) 
     throws Exception 
{ 
    KeyImportFile keyImportFile; 

    SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    Schema schema = schemaFactory.newSchema(xsdSource); 

    JAXBContext jc = JAXBContext.newInstance(KeyImportFile.class); 

    UnmarshallerHandler unmarshallerHandler = jc.createUnmarshaller().getUnmarshallerHandler(); 

    SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); 
    saxParserFactory.setSchema(schema); 

    SAXParser saxParser = saxParserFactory.newSAXParser(); 
    XMLReader xmlReader = saxParser.getXMLReader(); 
    xmlReader.setContentHandler(unmarshallerHandler); 
    xmlReader.setErrorHandler(keyImportErrorHandler); 

    InputSource inputSource = new InputSource(xmlInputStream); 
    xmlReader.parse(inputSource); 
    xmlInputStream.close(); 

    keyImportFile = (KeyImportFile) unmarshallerHandler.getResult(); 

    return keyImportFile; 
} 

EDIT

Chỉ cần thay đổi phương thức phân tích cú pháp của tôi mà không sử dụng sax và nó hoạt động. Bất kỳ ý tưởng tại sao? Tôi muốn sử dụng sax với jabx cho vấn đề hiệu suất.

KeyImportFile keyImportFile; 

SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Schema schema = schemaFactory.newSchema(xsdSource); 

JAXBContext jc = JAXBContext.newInstance(KeyImportFile.class); 

Unmarshaller unmarshaller = jc.createUnmarshaller(); 
unmarshaller.setSchema(schema); 
keyImportFile = (KeyImportFile) unmarshaller.unmarshal(xmlInputStream); 
+1

Nếu bạn quan tâm trong việc thực hiện sau đó tôi sẽ đi với cách tiếp cận bạn đã cung cấp trong chỉnh sửa của bạn. Không chỉ ít mã hơn, nó ngăn cản bạn phá hoại bất kỳ tối ưu hóa hiệu suất nào mà nhà cung cấp JAXB đã đưa ra. Ví dụ EclipseLink JAXB (MOXy) sử dụng StAX làm trình phân tích cú pháp cơ bản (StAX thường nhanh hơn SAX) và mã của bạn sẽ làm cho MOXy chậm hơn là nhanh hơn. –

Trả lời

7

Resolved

Dường như JAXB không hoạt động đúng với phân tích cú pháp SAX trừ khi phân tích cú pháp được thiết lập để được namespace biết.

Chỉ cần thêm dòng này và nó hoạt động tốt

saxParserFactory.setNamespaceAware(true);