XStream:如何在编组XML中隐藏2个不必要的父节点?
在单元测试项目中,我需要一些帮助来弄清楚如何在编组XML中隐藏2个不必要的父节点? 任何人都可以帮我弄清楚如何做到这一点?
编组输出如下所示:
<suite>
<suiteName>Suite 1</suiteName>
<sauceURL>http://username-string:access-key-string@ondemand.saucelabs.com:80/wd/hub</sauceURL>
<tests>
<test>
<rowArgs>
<arg>
<enabled type="java.lang.Boolean">true</enabled>
</arg>
<arg>
<testname type="java.lang.String">Test 1</testname>
</arg>
<arg>
<environment type="java.lang.String">portal1</environment>
</arg>
<arg>
<testlocale type="java.lang.String">Grid</testlocale>
</arg>
<arg>
<browser type="java.lang.String">Firefox</browser>
</arg>
<arg>
<url type="java.lang.String">http://google.com</url>
</arg>
</rowArgs>
</test>
...
但我想隐藏不必要的“rowArgs”和“arg”标签,以便其余节点立即位于测试节点下方。 我怎样才能做到这一点?
你可以在这里看到我的代码,如果它可以帮助你。 我怀疑我需要写自己的变压器? 与此同时,我将在这个实验上工作。
事实上,你需要一个自定义的转换器,因为它是两个你不想显示的嵌套集合,而这些对象可能有其他的子元素将被序列化。
这是XStream没有直接覆盖的情况,但可以通过自定义转换器轻松修复。
你可以在你的项目的git克隆中找到所有这些,其中包含所有这些修改。 但是,因为所有东西都应该在这里可见,所以我随后解释了问题的关键部分,包括一些代码示例。
我为您的项目实施了这样的转换器。 执行转换的代码是这样的:
@Override
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
TestRow test = (TestRow)source;
for (TestArguments arg : test.getArguments()) {
for (ArgObject val : arg.getAllTestArguments()) {
writer.startNode(val.getKey());
writer.addAttribute("type", val.getType());
writer.setValue(val.getVal());
writer.endNode();
}
}
}
@Override
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
TestArguments testargs = new TestArguments();
while (reader.hasMoreChildren()) {
reader.moveDown();
String typeval = reader.getAttribute("type");
if (typeval.isEmpty()) {
typeval = "null";
}
testargs.getAllTestArguments().add(new ArgObject(reader.getNodeName(), typeval, reader.getValue()));
reader.moveUp();
}
TestRow result = new TestRow(testargs);
return result;
}
这将使用您在ArgConverter
定义的扁平节点结构将所有ArgObjects序列化为xml。 反序列化从这些数据创建对象。
您的源代码中存在两个防止反序列化的错误:
SuiteData
有问题(别名为suite)。 为此,我在XStream对象中添加了一个aliad,就像这个xStream.alias("suite", SuiteData.class);
在你的XMLDataHelper
。 TestArguments
实例(因为您必须通过反序列化),那么可以调用reset将argsWrapper
成员argsWrapper
为null,然后使得添加参数变得不可能。 我解决了在重置方法中新成立的初始化该成员变量( argsWrapper = new ArrayList<ArgObject>();
)。 就我所了解的你的代码而言,这可以按照序列化/反序列化的预期工作。 我写了一个小测试程序来强制这个过程,它似乎产生了相同的结果:
public class XMLDataHelperTest {
public static void main(String[] args) {
File file = new File(System.getProperty("user.dir"), "test.xml");
if (file.isFile()) {
assertTrue(file.delete());
}
// write it once
XMLDataHelper helper = new XMLDataHelper(file.getAbsolutePath());
// read it once
helper = new XMLDataHelper(file.getAbsolutePath());
System.out.println(file);
}
}
链接地址: http://www.djcxy.com/p/76187.html
上一篇: XStream: how can I hide 2 unnecessary parent nodes in marshaled XML?