有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用JAXB读取Xml文件

我想读取一个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)

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

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

共 (2) 个答案

  1. # 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();
    }
    
  2. # 2 楼答案

    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(请参阅:http://blog.bdoughan.com/2012/07/jaxb-and-root-elements.html)将类与XML文档的根元素相关联。或者,您可以使用一个unmarshal方法,该方法接受一个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);
        }
    
    }
    

    输入。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>