gpt4 book ai didi

java - XStream:在我解析时折叠 XML 层次结构

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:23:36 31 4
gpt4 key购买 nike

我有一个 XML 文档(由 Adob​​e 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com