2013-06-12 70 views
4

我想读取xml文件(如下所示),但我得到Execption。 你能帮我解决这个问题吗?阅读与JAXB的Xml文件

<?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) 

信封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; 
    } 

日志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

我想从我的XML文件中得到2个独立的列表。 – Ritz

+0

这意味着获取所有“key”和“value”中的所有标记的List1,然后获取标记中标记中的所有“key”和“value”的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) 

你需要确保你的一类使用@XmlRootElement@XmlElementDecl的XML文档的根元素相关联(见:http://blog.bdoughan.com/2012/07/jaxb-and-root-elements.html)。或者,您可以使用采用Class参数的解组方法之一来告知JAXB您正在解组的什么类型的对象。


域模型(配置)

我会建议有一个域类像下面从中你能获得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; 
    } 

} 

演示

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 这意味着获取所有“key”和“value”中的所有“”标记的List1,然后获取标记为标记的所有“key”和“value”的List2。 – Ritz

+0

这是我的问题.... – Ritz

+0

亲爱的“mikhail”..不幸的是,customer = config.getLog()。getProperties()。size(); 返回“0”。 whay? – Ritz