- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 XML 文档(由 Adobe XFA 表单生成),其中包含如下数据:
<Position>
<PositionBorder>
<Title/>
<StartDate/>
<EndDate/>
</PositionBorder>
</Position>
由于这个文件是在别处定义的,我不能随意更改我得到的 XML 格式。
在我的 Java 代码中,我创建了一个包含标题、开始和结束日期的 Position 类。
我的问题是,当我使用 XStream 解析文件时,它需要一个 PositionBorder 类来保存标题和日期。我想基本上忽略边框并将所有字段放入 Position 类中。
我真正想做的是使用类似 convertAnother 方法的方法来转换位置元素的子元素。我试图这样做但失败了,因为我的 PositionConverter 被调用以获得 PositionBorder(当我调用 convertAnother 时)。
有人知道如何在解析时处理折叠 XML 的结构吗?
最佳答案
使用自定义转换器并不难。这是一个有点长的示例,但我希望它足够简单,可以让您了解您需要做什么:
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
public final class ConverterTest {
public static void main(String[] args) {
XStream xstream = new XStream();
xstream.autodetectAnnotations(true);
xstream.registerConverter(new PositionConverter());
final Position position = new Position();
position.setTitle("The Title");
position.setStartDate("The Start Date");
position.setEndDate("The End Date");
final String xml = xstream.toXML(position);
System.out.println("Generated XML:");
System.out.println(xml);
final Position genPosition = (Position) xstream.fromXML(xml);
System.out.println("Generated Position:");
System.out.println("\tTitle: " + genPosition.getTitle());
System.out.println("\tStart Date: " + genPosition.getStartDate());
System.out.println("\tEnd Date: " + genPosition.getEndDate());
}
@XStreamAlias("Position")
private static class Position {
public String getEndDate() {
return endDate;
}
public void setEndDate(String endDate) {
this.endDate = endDate;
}
public String getStartDate() {
return startDate;
}
public void setStartDate(String startDate) {
this.startDate = startDate;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
private String title;
private String startDate;
private String endDate;
}
private static class PositionConverter implements Converter {
public boolean canConvert(Class clazz) {
return Position.class == clazz;
}
public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) {
Position position = (Position)value;
writer.startNode("PositionBorder");
writer.startNode("Title");
writer.setValue(position.getTitle());
writer.endNode();
writer.startNode("StartDate");
writer.setValue(position.getStartDate());
writer.endNode();
writer.startNode("EndDate");
writer.setValue(position.getEndDate());
writer.endNode();
writer.endNode();
}
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
Position position = new Position();
// move it to <PositionBorder> tag.
reader.moveDown();
// now move it to <Title> tag.
reader.moveDown();
String title = reader.getValue();
position.setTitle(title);
reader.moveUp(); // moves back to <PositionBorder>
reader.moveDown(); // should move down to <StartDate> tag
String startDate = reader.getValue();
position.setStartDate(startDate);
reader.moveUp(); // move back to <PositionBorder>
reader.moveDown(); // should move down to <EndDate> tag
String endDate = reader.getValue();
position.setEndDate(endDate);
reader.moveUp(); // move back to <PositionBorder>
return position;
}
}
}
尝试运行它,看看会发生什么。当然,您需要修改它以适合您自己的类型——我只是将字符串用于所有 Position 的字段(而且我确定您的 Position 类也没有嵌套),但是从 String 转换到一个日期(或其他什么)应该是相当微不足道的。
您需要关注的一件事(在我的示例中我可能没有完全正确理解)是匹配您的 reader.moveDown() 和 reader.moveUp() 调用. (而且,如果您打算进行任何编码而不只是解码——我不希望您的问题出现这种情况——您还需要匹配您的 writer.startNode() 和 writer.endNode() 调用.) 它可能不会对这个示例造成任何问题,但我相信如果您正在做任何更大的事情或使用相同的 XStream 或 Converter 实例处理多个文件,它会引发问题。此外,如果您从无效位置尝试 reader.moveDown(),您将得到一个非常丑陋的异常——它应该非常明显。
我不得不尝试使用 moveUp/moveDown 方法来将它们放在正确的位置,所以我相信您需要对其进行测试和调整,直到获得所需的内容。
关于java - XStream:在我解析时折叠 XML 层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2045290/
我有一个输入 xml 和相应的 java 类,如下所示。 name street public class Address { private String name; /
我在 Kettle 下使用 XStream 将 XML 反序列化为 Java 对象,但它总是给我带来异常:nodecom.thoughtworks.xstream.mapper.CannotResol
XStream的安全框架未初始化,XStream可能存在漏洞 在使用 XStream (1.4.10) 时,此控制台错误一直显示为红色 我尝试了以下方法: XStream.setupDefaultSe
我正在尝试解析 XML 文档,这是文档的结构 Lily Brown
对于本地转换器,在编码到 XML 时,是否可以访问父对象? 我需要使用来自第三方源的项目编码集合 - 使用存储在父对象中的 id。 唉,似乎没有办法查询通向当前对象的对象路径。或者有吗? 最佳答案 我
我在反序列化 Xml 时遇到 java 泛型和 xstream 的问题。 这是主要的DTO @XStreamAlias("OBJECTX") public class ObjectX { @X
如果你有这样的功能: List getUsers() {} 如果 getUsers 返回一个只有一个元素的 List,则生成的 JSON 只是一个 JSON 对象而不是 JSON 数组。 是否有解决方
我有一个我想用 Xstream 序列化的类结构。根类包含其他对象(不同类型)的集合。我只想序列化存储在集合中的部分对象(主要是它们的 ID,而不是每个元素的剩余内容)。 任何人都知道我该怎么做? 谢谢
这个问题在这里已经有了答案: XStream short dynamic aliases (3 个回答) 5年前关闭。 现在 XStream 使用 class.getName() 作为别名,但我想使用
在 xstream for java 中,有没有办法通过确保对象通过带有参数的特定构造函数来反序列化对象? 最佳答案 XStream(或一般的反序列化)不调用构造函数。 (除了很少使用的纯 Java
使用以下设置时出现 XStream 错误。我一定是疯了。怎么了? 请求类 @XStreamAlias("RequestTO") public class RequestTO { @XStrea
我正在使用 XStream 将我的对象序列化为 XML 格式。我得到的格式化xml如下: node1, node2, node 3 是pojo的属性,DetailDollars 我有一个要求,我必须计
我正在尝试使用 XStream 反序列化 XML。在那里我有对象 A ,它没有默认的构造函数。然后是引用对象A 的对象B。此时,A 已实例化,但所有字段均为空,即使这些值是在 XML 中定义的。 我的
我正在使用 'com.thoughtworks.xstream:xstream:1.4.10' 库并尝试解析 xml 文件。 Broker是根元素,里面还有其他标签 问题是当我生成 xml
我正在使用 XStream,但我在使用特殊字符 á、é、í、ó、ú 和 ñ 时遇到问题。 我尝试过这个: String charset = "UTF-8"; xstream = new XSt
我已经编写了一些代码来为之前写入sql的用户生成密码。然后我想将每个用户的用户名和密码写入xml。该代码似乎工作正常,除了在大约第 200 个用户时它突然停止在 xml 标记中途并结束,这非常奇怪。我
我正在使用 XStream 序列化程序来序列化原语,但在反序列化时遇到了问题。问题描述如下: 比如说,我有: int i = 80; 我将其序列化如下: serializer.toXML(i, new
我正在考虑使用 XStream 库,但我有几个问题/疑虑。 假设我有一个复杂的对象,我想使用 XStream 将其序列化为 XML(或 JSON)。 XStream 是否能够在不需要任何额外工作的情况
如何维护 Set 中未编码子对象的顺序。下面是我的xml,当转换为java对象时,我在集合中得到的顺序不是A、B、C。我怎样才能实现这一目标? 编辑:观察结果: 在我的 Comp
我目前正在使用 XStream 来序列化一些未实现 Serialized 的对象。有没有办法告诉 XStream 如果对象确实实现了 Serialized,则使用 Java 的默认序列化;如果没有实现
我是一名优秀的程序员,十分优秀!