2013-06-12 5 views
4

Я хочу прочитать XML-файл (как показано ниже), но я получаю Execption. Не могли бы вы помочь мне, как я могу исправить эту проблему?читать Xml-файл с JAXB

<?xml version="1.0" encoding="UTF-8"?> 
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= 
"file:///C:/Documents%20and%20Settings/mojalal/Desktop/FirstXSD.xml"> 
<log> 
    <property key="firstKey" value="firstValue"></property> 
    <property key="secoundKey" value="secoundKey"></property> 
    <property key="thirdKey" value="thirdValue"></property> 
</log> 

<env> 
    <property key="firstenv" value="fo"></property> 
    <property key="123" value="333"></property> 
</env> 
</config> 

и это мой код, который я хочу читать XML-файл

public class ReadXMLFilewithJAXB { 
private static List<Property> customer; 

@SuppressWarnings("unchecked") 
public static void main(String[] args) { 

try { 

    File file = new File("c:\\FirstXML.xml"); 
    JAXBContext jaxbContext = JAXBContext.newInstance(Log.class); 
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
    customer = (List<Property>) jaxbUnmarshaller.unmarshal(file); 
} catch (JAXBException e) { 
    e.printStackTrace(); 
    } 

} 

}

наконец это исключение, что я получаю это

javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"config"). Expected elements are (none) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:631) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:236) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:231) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:105) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1038) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:467) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:448) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:137) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:501) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:400) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:626) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3103) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:922) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205) 
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:200) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:173) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:142) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:151) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:169) 
    at firstExample.ReadXMLFilewithJAXB.main(ReadXMLFilewithJAXB.java:21) 

Env POJO класса

public class Env { 
    List<Property> properties2; 


    public Env() { 
    } 


    public Env(List<Property> properties2) { 
     super(); 
     this.properties2 = properties2; 
    } 


    public List<Property> getProperties2() { 
     return properties2; 
    } 

    public void setProperties2(List<Property> properties2) { 
     this.properties2 = properties2; 
    } 

LOG POJO класс

@XmlRootElement 
public class Log { 
    List<Property> properties=new ArrayList<Property>();; 

    public Log(){ 

    } 

    public List<Property> getProperties() { 
     return properties; 
    } 

    public void setProperties(List<Property> properties) { 
     this.properties = properties; 
    } 
+0

Какую информацию вы пытаетесь получить из документа XML? Вас интересуют только свойства в элементе 'log'? –

+0

Я хочу получить 2 отдельных списка из моего XML-файла. – Ritz

+0

это означает, что получите List1 для всех «ключей» и «значений», которые находятся в теге , а затем получите List2 для всех «ключей» и «значений», которые находятся в теге . – Ritz

ответ

4
javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"config"). Expected elements are (none) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:631) 

Вы должны убедиться, что вы связать класс с корневым элементом документа XML с использованием @XmlRootElement или @XmlElementDecl (см : http://blog.bdoughan.com/2012/07/jaxb-and-root-elements.html). В качестве альтернативы вы можете использовать один из методов unmarshal, которые принимают параметр Class, чтобы сообщить JAXB, какой тип объекта вы размонтируете.


Domain Model (Config)

Я бы рекомендовал иметь класс домена как следующий, из которого можно получить два списка Property объектов.

import java.util.*; 
import javax.xml.bind.annotation.*; 

@XmlRootElement 
public class Config { 

    private List<Property> logProperties = new ArrayList<Property>(); 
    private List<Property> envProperties = new ArrayList<Property>(); 

    @XmlElementWrapper(name="log") 
    @XmlElement(name="property") 
    public List<Property> getLogProperties() { 
     return logProperties; 
    } 

    @XmlElementWrapper(name="env") 
    @XmlElement(name="property") 
    public List<Property> getEnvProperties() { 
     return envProperties; 
    } 

} 

Demo

import java.io.File; 
import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Config.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum17059227/input.xml"); 
     Config config = (Config) unmarshaller.unmarshal(xml); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.setProperty(Marshaller.JAXB_NO_NAMESPACE_SCHEMA_LOCATION, "file:///C:/Documents%20and%20Settings/mojalal/Desktop/FirstXSD.xml"); 
     marshaller.marshal(config, System.out); 
    } 

} 

Input.xml/выход

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file:///C:/Documents%20and%20Settings/mojalal/Desktop/FirstXSD.xml"> 
    <env> 
     <property key="firstenv" value="fo"/> 
     <property key="123" value="333"/> 
    </env> 
    <log> 
     <property key="firstKey" value="firstValue"/> 
     <property key="secoundKey" value="secoundKey"/> 
     <property key="thirdKey" value="thirdValue"/> 
    </log> 
</config> 
1

При описании модели XML, вы должны начать с корневым объектом (в вашем случае это <config> элемента).

@XmlRootElement(name="config") 
class Config implements Serializable { 
    private Log log; 
    private Env env; 

    @XmlElement(name="log") 
    public Log getLog() { 
     return this.log; 
    } 

    @XmlElement(name="env") 
    public Env getEnv() { 
     return this.env; 
    } 

    // Setters are omitted 
} 

А потом разобрать XML как следующее:

JAXBContext jaxbContext = JAXBContext.newInstance(Config.class); 
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
Config config = (Config) jaxbUnmarshaller.unmarshal(file); 
if (config != null && config.getLog() != null) { 
    customer = config.getLog().getProperties(); 
} 
+0

Я хочу получить 2 отдельный список из моего XML-файла \t это означает, что получите List1 для всех «ключей» и «значений», которые находятся в теге , а затем получите List2 для всех «ключей» и «значений», которые находятся в теге . – Ritz

+0

это моя проблема .... – Ritz

+0

Уважаемый "mikhail" ..К сожалению, клиент = config.getLog(). getProperties(). size(); возвращение "0". whay? – Ritz

Смежные вопросы