gpt4 book ai didi

java - XStream:如何在编码的 XML 中隐藏 2 个不必要的父节点?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:30:20 25 4
gpt4 key购买 nike

在单元测试项目中,我需要一些帮助来弄清楚如何在编码的 XML 中隐藏 2 个不必要的父节点?谁能帮我弄清楚怎么做?

我的 marshalled output看起来像这样:

<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”标记,以便其余节点紧接在测试节点下。我该怎么做?

您可以 see my code HERE, if it helps你来帮我。我怀疑我需要写自己的变压器?与此同时,我将进行该实验。

最佳答案

事实上,您将需要一个自定义转换器,因为它是两个您不想显示的嵌套集合,并且这些对象可能具有其他将被序列化的子元素。

XStream 没有直接涵盖这种情况,但可以使用自定义转换器轻松修复。

您可以在 git clone of your project 中找到所有这些其中包含所有这些修改。但由于这里的一切都应该是可见的,我随后解释了问题的关键部分,包括一些代码示例。

我为您的项目实现了这样一个转换器。进行转换的代码是这样的:

  @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;
}

这会将所有 ArgObject 序列化为具有您在 ArgConverter 中定义的平面节点结构的 xml .反序列化从该数据创建对象。

您的源代码中有两个错误阻止了反序列化:

  • XStream 反序列化无法识别所有别名注释。您的根元素有问题 SuiteData (别名为套房)。为此,我向 XStream 对象添加了一个别名,如下所示 xStream.alias("suite", SuiteData.class);在你的XMLDataHelper .
  • 如果您创建一个 TestArguments具有默认构造函数的实例(因为你必须通过反序列化),你调用 reset 分配你的 argsWrapper member 为 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);
}
}

关于java - XStream:如何在编码的 XML 中隐藏 2 个不必要的父节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20601369/

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