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);
如果你有興趣的表現,那麼我會與你在你的編輯提供的方法去。它不僅可以減少代碼,還可以防止破壞JAXB提供商實施的任何性能優化。例如,EclipseLink JAXB(MOXy)使用StAX作爲底層解析器(StAX通常比SAX更快),您的代碼會使MOXy變得更慢而不是更快。 –