我正在尝试使用JAXB将XML数据反序列化为Java内容树,在解组时验证XML数据:
try {
JAXBContext context = JAXBContext.newInstance("com.acme.foo");
Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setSchema(schema);
FooObject fooObj = (FooObject) unmarshaller.unmarshal(new File("foo.xml"));
} catch (UnmarshalException ex) {
ex.printStackTrace();
} catch (JAXBException ex) {
ex.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
当我使用Java 8构建项目时,它很好,但使用Java 11构建它失败并出现编译错误:
package javax.xml.bind does not exist
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
我是使用JAXB的新手,我使用JAXB 2.1.3的xjc从我的XML Schema生成一组类.除了为我的模式中的每个元素生成一个类之外,它还创建了一个ObjectFactory类.
似乎没有什么能阻止我直接实例化元素,例如
MyElement element = new MyElement();
Run Code Online (Sandbox Code Playgroud)
而教程似乎更喜欢
MyElement element = new ObjectFactory().createMyElement();
Run Code Online (Sandbox Code Playgroud)
如果我查看ObjectFactory.java,我会看到:
public MyElement createMyElement() {
return new MyElement();
}
Run Code Online (Sandbox Code Playgroud)
这是什么交易?为什么我甚至不打扰保持ObjectFactory类?我假设如果我从更改的模式重新编译它也将被覆盖.
unexpected element (uri:"", local:"Group"). Expected elements are <{}group>
Run Code Online (Sandbox Code Playgroud)
从xml解组时遇到异常
JAXBContext jc = JAXBContext.newInstance(Group.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Group group = (User)unmarshaller.unmarshal(new File("group.xml"));
Run Code Online (Sandbox Code Playgroud)
组类没有任何注释,group.xml只包含数据.
什么都可能是原因?
是的,是的,我知道有很多关于这个主题的问题.但我仍然无法找到解决问题的方法.我有一个属性注释的Java对象.例如Customer,就像在这个例子中一样.我想要一个String表示它.谷歌建议将JAXB用于此类目的.但是在所有示例中,创建的XML文件都打印到文件或控制台,如下所示:
File file = new File("C:\\file.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
// output pretty printed
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(customer, file);
jaxbMarshaller.marshal(customer, System.out);
Run Code Online (Sandbox Code Playgroud)
但我必须使用此对象并以XML格式通过网络发送.所以我想得到一个代表XML的String.
String xmlString = ...
sendOverNetwork(xmlString);
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
当JAXB将日期对象(XMLGregorianCalendar)编组到xsd:dateTime元素中时,如何指定生成的XML的格式?
例如:默认数据格式是使用<StartDate>2012-08-21T13:21:58.000Z</StartDate>
我需要的毫秒来省略毫秒. <StartDate>2012-08-21T13:21:58Z</StartDate>
如何指定我希望它使用的输出格式/日期格式?我正在使用javax.xml.datatype.DatatypeFactory创建XMLGregorianCalendar对象.
XMLGregorianCalendar xmlCal = datatypeFactory.newXMLGregorianCalendar(cal);
Run Code Online (Sandbox Code Playgroud) 升级到JDK 1.7后,我得到以下异常:
java.lang.VerifyError: Expecting a stackmap frame at branch target 71 in method com.abc.domain.myPackage.MyClass$JaxbAccessorM_getDescription_setDescription_java_lang_String.get(Ljava/lang/Object;)Ljava/lang/Object; at offset 20
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2413)
at java.lang.Class.getConstructor0(Class.java:2723)
at java.lang.Class.newInstance0(Class.java:345)
at java.lang.Class.newInstance(Class.java:327)
at com.sun.xml.internal.bind.v2.runtime.reflect.opt.OptimizedAccessorFactory.instanciate(OptimizedAccessorFactory.java:184)
at com.sun.xml.internal.bind.v2.runtime.reflect.opt.OptimizedAccessorFactory.get(OptimizedAccessorFactory.java:129)
at com.sun.xml.internal.bind.v2.runtime.reflect.Accessor$GetterSetterReflection.optimize(Accessor.java:384)
at com.sun.xml.internal.bind.v2.runtime.property.SingleElementLeafProperty.<init>(SingleElementLeafProperty.java:72)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at com.sun.xml.internal.bind.v2.runtime.property.PropertyFactory.create(PropertyFactory.java:113)
at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.<init>(ClassBeanInfoImpl.java:166)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getOrCreate(JAXBContextImpl.java:494)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:311)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:126)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1148)
at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:130)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:248)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:235)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:445)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:637)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:584)
at com.abc.domain.myPackage.MyClass.marshalFacetsTest(MyClass.java:73) …Run Code Online (Sandbox Code Playgroud) 您是否知道JAXB设置可以防止在生成的XML中生成standalone ="yes"?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Run Code Online (Sandbox Code Playgroud) 例:
</plugin>
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.7.1</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<schemaDirectory>src/main/resources/dir1</schemaDirectory>
<schemaIncludes>
<include>schema1.xsd</include>
</schemaIncludes>
<generatePackage>schema1.package</generatePackage>
</configuration>
</plugin>
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.7.1</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<schemaDirectory>src/main/resources/dir2</schemaDirectory>
<schemaIncludes>
<include>schema2.xsd</include>
</schemaIncludes>
<generatePackage>schema2.package</generatePackage>
</configuration>
</plugin>
</plugins>
Run Code Online (Sandbox Code Playgroud)
发生了什么:Maven执行第一个插件.然后删除目标文件夹并创建第二个包,然后该包可见.
我尝试为第一个配置设置target/somedir1,为第二个配置设置target/somedir2.但这种行为并没有改变?有任何想法吗?我不想直接在src/main/java文件夹中生成包,因为这些包是经过处理的,不应与手动创建的类混合使用.
如何使用JAXB生成以下XML?
<sport type="" gender="">
sport description
</sport>
Run Code Online (Sandbox Code Playgroud) 问题是关于JAXB Map编组 - 有很多关于如何将Map转换为如下结构的示例:
<map>
<entry>
<key> KEY </key>
<value> VALUE </value>
</entry>
<entry>
<key> KEY2 </key>
<value> VALUE2 </value>
</entry>
<entry>
...
</map>
Run Code Online (Sandbox Code Playgroud)
实际上,这是JAXB原生支持的.但是,我需要的是XML,其中key是元素名称,value是其内容:
<map>
<key> VALUE </key>
<key2> VALUE2 </key2>
...
</map>
Run Code Online (Sandbox Code Playgroud)
我没有按照JAXB开发人员推荐的方式(https://jaxb.dev.java.net/guide/Mapping_your_favorite_class.html)成功实现我的Map适配器,因为我需要,他 - 动态属性名称:)
那有什么解决方案吗?
PS目前我必须为每个我想要编组的典型键值对创建一个专用的容器类 - 它可以工作,但是我必须创建太多这些辅助容器.
jaxb ×10
java ×8
xml ×5
xsd ×2
datetime ×1
format ×1
java-11 ×1
java-7 ×1
jaxb2 ×1
marshalling ×1
maven-2 ×1
milliseconds ×1
schema ×1
xml-binding ×1