我想阅读xml文件(如下所示),但我得到了Execption。 你能帮我解决一下如何解决这个问题吗?
<?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 Class
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 Class
@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 :(得分:5)
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
参数的unmarshal方法来告诉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 :(得分:2)
当您描述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();
}