2013-04-12 110 views
5

返回null解編XML文件後,這是在XML文件中屬性的所有屬性有NULL值(fileDateTime,FILEID,等...)JAXB解組的屬性

我真的不明白,爲什麼作爲我有正確標註@XmlAttribute(name = "FileDateTime")@XmlAttribute(name = "FileId")

正如你可以看到我不使用任何命名空間(所以不是一個命名空間的問題,我想!)

我使用JDK 1.6,薩克斯2.0.1和2.9 XercesImpl .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... 

parse方法(解組& 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; 
} 

編輯

只要改變我的解析方法,無需使用SAX和它的作品。任何想法爲什麼?我想使用sax和jabx來解決性能問題。

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更快),您的代碼會使MOXy變得更慢而不是更快。 –

回答

7

解決

看來,JAXB不能正常使用SAX解析器,除非解析器設置爲名稱空間感知的工作。

剛加入這一行,它工作正常

saxParserFactory.setNamespaceAware(true);