2013-04-12 11 views
5

के लिए अशक्त लौट unmarshal एक्सएमएल फ़ाइल unmarshalling के बाद, सभी गुण जो एक्सएमएल फ़ाइल में गुण हैं Null मूल्य (fileDateTime, fileId, आदि ...) हैJAXB विशेषताओं

मैं सच में समझ में नहीं आता क्यों के रूप में मैं सही एनोटेशन @XmlAttribute(name = "FileDateTime") और @XmlAttribute(name = "FileId")

है आप देख सकते हैं मैं किसी भी नाम स्थान का उपयोग नहीं करते (ऐसा नहीं एक नाम स्थान मुद्दा मुझे लगता है कि!)

मैं JDK 1.6, सैक्स 2.0.1 और XercesImpl 2.9 उपयोग कर रहा हूँ .1

आपकी मदद के लिए धन्यवाद।

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... 

पार्स विधि (unmarshal & 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

बस sax का उपयोग किए बिना मेरी पार्स विधि बदलें और यह काम करता है। कोई विचार क्यों? मैं प्रदर्शन समस्या के लिए जेएक्सएक्स के साथ sax का उपयोग करना चाहता हूं।

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

काम करता है, तो आप प्रदर्शन में रुचि रखते हैं तो मैं दृष्टिकोण आप अपने संपादन में प्रदान की है के साथ जाना होगा। न केवल यह कम कोड है, यह आपको JAXB प्रदाता द्वारा किए गए किसी भी प्रदर्शन अनुकूलन को कमजोर करने से रोकता है। उदाहरण के लिए EclipseLink JAXB (MOXy) अंतर्निहित पार्सर के रूप में StAX का उपयोग करता है (StAX आमतौर पर SAX से तेज़ होता है) और आपका कोड तेजी से मोक्सी धीमा कर देगा। –

उत्तर

7

हल

ऐसा लगता है कि JAXB SAX पार्सर के साथ ठीक से काम नहीं करता है जब तक कि पार्सर नाम स्थान बारे में पता होना करने के लिए निर्धारित है।

बस इस लाइन को जोड़ कर उसे ठीक

saxParserFactory.setNamespaceAware(true);