java – JAXB中的Unmarshaller和模式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – JAXB中的Unmarshaller和模式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4513字,纯文字阅读大概需要7分钟。
内容图文
![java – JAXB中的Unmarshaller和模式](/upload/InfoBanner/zyjiaocheng/813/8f0a34885f844e069698e85130a48a74.jpg)
我有应用程序,可以以各种格式保存文件(所有这些都是xml).所以我应该在确定格式文件已保存的情况下解决问题.所以,我看到了2个解决方案
>不同的格式有不同的模式,所以我可以通过它们来确定.
我按照从here开始的方式设置模式
marshaller.setProperty(Marshaller.JAXB_NO_NAMESPACE_SCHEMA_LOCATION,“bla-bla.xsd”);
所以我想我可以使用unmarshaller.getProperty(Marshaller.JAXB_NO_NAMESPACE_SCHEMA_LOCATION)来获取它
但它扔了
javax.xml.bind.PropertyException:
jaxb.noNamespaceSchemaLocation
和getSchema()返回null
那么,我怎样才能获得架构位置?
>使用setAdapter(Class< A> type,A adapter)方法为不同的bean指定不同的适配器
什么方式更可取?如果是第一个,那我怎样才能获得架构位置标签?
upd代码示例
假设我们有豆
@XmlRootElement
public class Foo{
String bar;
public String getBar() {return bar; }
public void setBar(String bar) {this.bar = bar;}
}
和生成模式的代码,然后保存Foo的实例和加载.
public class Test {
final static String schemaLoc = "fooschema.xsd";
public static void write(File file, Foo foo, Schema schema) throws Throwable {
XMLEventWriter xsw = null;
try{
JAXBContext context = JAXBContext.newInstance(Foo.class);
XMLOutputFactory xof = XMLOutputFactory.newInstance();
OutputStream out = new FileOutputStream(file);
xsw = xof.createXMLEventWriter(out);
Marshaller m = context.createMarshaller();
m.setSchema(schema); //schema setted
System.out.println(">>>marchal : " + m.getSchema()); //check it
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.setProperty(Marshaller.JAXB_NO_NAMESPACE_SCHEMA_LOCATION, schemaLoc);
m.marshal(foo, xsw);
} finally{
xsw.close();
}
}
public static Foo load(File file) throws Throwable {
JAXBContext context = JAXBContext.newInstance(Foo.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
System.out.println("unmarshaller schema:" + unmarshaller.getSchema()); //I need get it here
// System.out.println("schema_prop:" + unmarshaller.getProperty(Marshaller.JAXB_NO_NAMESPACE_SCHEMA_LOCATION));
InputStreamReader in = new InputStreamReader(new FileInputStream(file));
XMLEventReader xer = XMLInputFactory.newInstance()
.createXMLEventReader(in);
return Foo.class.cast(unmarshaller.unmarshal(xer));
}
private static File createSchema(String schemaLocation) throws Throwable{
final File target = new File(schemaLocation);
if(!target.exists()){
JAXBContext jaxbContext = JAXBContext.newInstance(Foo.class);
SchemaOutputResolver sor = new SchemaOutputResolver() {
public Result createOutput(String namespaceURI, String suggestedFileName)
throws IOException {
StreamResult result = new StreamResult(target);
result.setSystemId(target.toURI().toURL().toString());
return result;
}
};
jaxbContext.generateSchema(sor);
}
return target;
}
public static void main(String[] args) throws Throwable {
createSchema(schemaLoc);
File file = new File("temp.xml");
Foo foo = new Foo();
foo.setBar("test bar");
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(createSchema(schemaLoc));
write(file, foo, schema);
System.out.println("result " + load(file).getBar());
}
}
生成的模式
<xs:element name="foo" type="foo"/>
<xs:complexType name="foo">
<xs:sequence>
<xs:element name="bar" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
我们的临时文件
<?xml version="1.0"?>
<foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="fooschema.xsd">
<bar>test bar</bar></foo>
正如我们所见,有
xsi:noNamespaceSchemaLocation=”fooschema.xsd”
我如何使用JAXB获取此文本?
解决方法:
我将利用StAX解析器来获取此信息(请参阅下面的示例).在输入上创建XMLStreamReader.使用nextTag()方法将XMLStreamReader推进到根元素.然后获取根元素的noNamespaceSchemaLocation属性.然后将XMLStreamReader传递给Unmarshaller上的unmarshal(XMLStreamReader)方法.
import java.io.FileInputStream;
import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext context = JAXBContext.newInstance(Categories.class);
XMLInputFactory xif = XMLInputFactory.newInstance();
FileInputStream fis = new FileInputStream("input.xml");
XMLStreamReader xsr = xif.createXMLStreamReader(fis);
xsr.nextTag();
String noNamespaceSchemaLocation = xsr.getAttributeValue(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "noNamespaceSchemaLocation");
System.out.println(noNamespaceSchemaLocation);
Unmarshaller um = context.createUnmarshaller();
Categories response = (Categories) um.unmarshal(xsr);
}
}
内容总结
以上是互联网集市为您收集整理的java – JAXB中的Unmarshaller和模式全部内容,希望文章能够帮你解决java – JAXB中的Unmarshaller和模式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。