- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有一个深层的 XML 结构,其中有很多无意义的包装器,我正在映射到一个 Java 类。使用@XmlPath 映射简单数据类型就像在公园里散步一样简单,但是当涉及到实际需要自己的类的类型时,我不太确定该怎么做,尤其是当这些类型也应该放在列表中时。
我在将以下示例中的所有 element
类型映射到我的 Element
类时遇到问题。由于 elements
包装器驻留在使用 @XmlPath
映射的资源中,我不能使用 @XmlElementWrapper
,否则我通常会这样会这样做。
示例 XML 结构
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<s:root xsi:schemaLocation="http://www.example.eu/test ResourceSchema.xsd" xmlns:s="http://www.example.eu/test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<s:resource>
<s:information>
<s:date>2013-07-04</s:date>
<s:name>This example does not work</s:name>
</s:information>
<s:elements>
<s:refobj>
<s:id>1</s:id>
<s:source>First Source</s:source>
</s:refobj>
<s:refobj>
<s:id>2</s:id>
<s:source>Second Source</s:source>
</s:refobj>
<s:refobj>
<s:id>5</s:id>
<s:source>Fifth Source</s:source>
</s:refobj>
</s:elements>
</s:resource>
</s:root>
根.java
@XmlRootElement(name = "root")
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
@XmlPath("resource/information/date/text()")
private String date;
@XmlPath("s:resource/s:information/s:name/text()")
private String name;
@XmlPath("resource/elements/refobj")
private List<RefObj> refObjs;
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
RefObj.java
@XmlRootElement(name = "refobj")
@XmlAccessorType(XmlAccessType.FIELD)
public class RefObj {
@XmlElement(name = "id")
private int id;
@XmlElement(name = "source")
private String source;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
}
编码器/解码器
public static void main(String[] args) {
String xml = getXML();
Root root = null;
try {
JAXBContext context = JAXBContext.newInstance(Root.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
StringReader stringReader = new StringReader(xml);
root = (Root) unmarshaller.unmarshal(stringReader);
} catch (Exception ex) {
System.err.println("Failed to unmarshal XML!");
}
try {
JAXBContext context = JAXBContext.newInstance(Root.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://www.example.eu/test ResourceSchema.xsd");
StringWriter stringWriter = new StringWriter();
marshaller.marshal(root, stringWriter);
System.out.println(new String(stringWriter.toString().getBytes(Charset.forName("UTF-8"))));
} catch (Exception ex) {
System.err.println("Failed to marshal object!");
}
}
package-info.java
@XmlSchema(
namespace = "http://www.example.eu/test",
attributeFormDefault = XmlNsForm.QUALIFIED,
elementFormDefault = XmlNsForm.QUALIFIED,
xmlns = {
@XmlNs(
prefix = "s",
namespaceURI = "http://www.example.eu/test")
},
location = "http://www.example.eu/test ResourceSchema.xsd")
package se.example.mavenproject1;
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
我可以执行该应用程序,但是当我解码/编码 XML 内容时没有映射任何元素,而是我得到一个仅包含信息的 XML 表示。
更新
在发布前面的示例后,我意识到它实际上按预期工作,这让我更加困惑。虽然我试图在我的生产代码中复制(以前的)工作示例但没有成功,尽管我已经设法将我遇到的问题实际引入示例代码中。因为我需要为出现的问题添加命名空间,所以我假设它与命名约定和 X(ml)Path 有关。
我还添加了 package-info.java
和我在处理这些对象时使用的编码器/解码器。由于 jaxb.properties 不包含任何令人兴奋的内容,因此我将其排除在外。
最佳答案
当我运行您的示例时,一切正常。由于您的真实模型可能具有获取/设置方法,因此您需要确保添加 @XmlAccessorType(XmlAccessType.FIELD)
到您的类,否则 MOXy(或任何其他 JAXB impl)也会将相应的属性视为已映射(参见:http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html)。
import java.util.List;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;
@XmlRootElement(name = "root")
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
@XmlPath("resource/information/date/text()")
private String date;
@XmlPath("resource/information/name/text()")
private String name;
@XmlPath("resource/elements/element")
private List<Element> elements;
}
您还需要确保您拥有 jaxb.properties
使用以下条目将 MOXy 指定为您的 JAXB 提供程序(请参阅:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html)。
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
了解更多信息
更新#1
当您的文档符合 @XmlPath
的命名空间时注释需要考虑到这一点。路径中的节点可以根据 @XmlSchema
进行限定。注解。
包信息
在你的package-info
类前缀 s
分配给命名空间 URI http://www.example.eu/test
.
@XmlSchema(
namespace = "http://www.example.eu/test",
attributeFormDefault = XmlNsForm.QUALIFIED,
elementFormDefault = XmlNsForm.QUALIFIED,
xmlns = {
@XmlNs(
prefix = "s",
namespaceURI = "http://www.example.eu/test")
},
location = "http://www.example.eu/test ResourceSchema.xsd")
package se.example.mavenproject1;
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
根
这意味着符合 http://www.example.eu/test
的节点命名空间应具有前缀 s
在@XmlPath
注释。
import java.util.List;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;
@XmlRootElement(name = "root")
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
@XmlPath("s:resource/s:information/s:date/text()")
private String date;
@XmlPath("s:resource/s:information/s:name/text()")
private String name;
@XmlPath("s:resource/s:elements/s:element")
private List<Element> elements;
}
更新#2
So it seems as if the namespace needs to be specified in the @XmlPath when mapping the path to a complex object, but can be skipped when mapping the path to a simple object such as a String or an integer.
这是一个错误。您应该命名空间限定 @XmlPath
对于简单的对象,就像你对复杂对象所做的一样(见更新#1)。正确的映射今天有效,我们将修复以下错误,以便不正确的映射能够正常运行。您可以使用下面的链接来跟踪我们在该问题上的进展:
关于java - 使用@XmlPath 和 jaxb/MOXy 来映射复杂类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17466534/
我在嵌入式 Jetty 9.x 服务器内使用 Jersey 2.x 和内置的 MOXy 转换从 JSONPOJO。 是否可以以编程方式(在 POJO 上没有注释)为特定类型(例如 Joda DateT
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
Moxie看起来很驼鹿,但标题信息量不大, Moxie - Not Another Moose Clone 看了一下,好像用了 B::CompilerPhase::Hook 额外的伏都教。这个库的最终
我有一个基类声明如下: package com.mystuff.surrogates; import java.io.Serializable; import java.util.UUID; publ
我正在使用 MOXy 2.5.1 以及 Jersey 2.4 和 Hibernate。我发现 MOXy 与一组特定的类有奇怪的编码行为。 我有一些与此类似的类(为简洁起见,删除了其他内容): publ
我正在使用 MOXy 来解码一个相对简单的 XML 文档,但我得到了不一致的行为。该文档由两个元素组成,其中包含基本信息(名称和日期),后跟记录列表。问题是名称和日期每次都正确解码,但是我经常得不到任
我按照指示here进行操作为了为我的带注释的类生成 XML 架构。我使用 MOXy 作为 JAXB 的底层实现,因为我需要它的某些功能,例如 @XmlPath 以及它如何处理 XmlAdapter 的
是否可以根据某些运行时信息有条件地仅输出元素(作为 XML 或 JSON)? 我自己找到了答案,并想与大家分享。 最佳答案 简单: return null 示例 我有一个列表“alertStems”和
我有一个非常简单的类,有两个字段,String sourceAddress 和 int port。 我希望它们映射到源/地址和源/端口节点而不是 jaxb 默认的 sourceAddress 和 so
使用EclipseLink MOXy JAXB实现,我试图使用@XmlPath批注基于元素的属性值获取元素值。我似乎无法正常工作。支持吗? XML摘录: ... 12345 blah POJO
我使用 moxy 来构建大型结构,在 95% 的情况下,它的效果就像 charme 一样。它快速且可靠。但我现在确实有一个具有相同类结构但数据不同的项目。现在我确实产生了很大的阅读影响。写完整的项目大
为了解决另一个问题,我已从使用 Jersey 转向使用 EclipseLink MOXy 从 JAXB 创建的对象模型(由 Sun JAXB 2.1.12 创建)生成 JSON。我注意到的一个区别是输
我有一个相当大的对象树,我想将其导出为 XML。名为 Person 的对象在多个地方使用(作为许多子实体的 userCreated、userModified、作为客户端等) 根据 Person 对象的
我正在使用 JAXB/MOXy 解码一个包含大约 50 个此类对象的 XML 文件: @XmlRootElement(name="Message") public class MyClass{ pri
我有一个使用 Jersey 和 MOXy 的 JAX-RS 服务。我有一个返回类型 Memo 的 JSON 或 XML(取决于 Accept: header )表示的处理程序,但如果找不到该项目,它应
我试图找到包含等同于 的类的 Maven 依赖项 import org.eclipse.persistence.oxm.annotations.XmlVariableNode; 这是我目前拥有的 PO
我正在定义一个静态工厂方法: @XmlType(factoryClass=DummyFactory.class, factoryMethod="createNew") public abstract
我的问题是 this 的后续问题评论。 我在同一个类上混合使用 JPA 和 JAXB (MOXy) 注释,大多数情况下效果很好。如链接线程中所述,@XmlInverseReference 在编码双向关
我似乎无法让@XmlCData 注释起作用,即使 MOXy 已正确设置。 我的代码,attached , 输出: 1
我正在编写一段代码,使用 MOXy 在运行时设置 XmlTransient。以下是改编自 http://blog.bdoughan.com/2011/06/moxy-extensible-models
我是一名优秀的程序员,十分优秀!