gpt4 book ai didi

java - 在 Simple 2.5.3 (Java) 中反序列化重复的 XML 元素

转载 作者:行者123 更新时间:2023-12-01 05:44:48 25 4
gpt4 key购买 nike

假设给出了以下 XML:

<?xml version="1.0" encoding="UTF-8"?>
<ResC>
<Err text="Error text 1"/>
<ConRes>
<Err text="Error text 2"/>
<ConList>
<Err text="Error text 3"/>
<Con>
<Err text="Error text 4"/>
</Con>
</ConList>
</ConRes>
</ResC>

如您所见 <Err>元素可能出现在 XML 的每个级别上。

使用Simple我想反序列化这个 XML。因此,我创建了以下类:

@Element(required=false)
public class Err {
@Attribute
private String text;

public void setText(String text) { this.text = text; }

public String getText() { return text; }
}

但是,我该如何注释 <ResC> 的类, <ConRes> , <ConList><Con> ?我真的必须声明 <Err> 类型的属性吗?在它可能出现的每个类别中?这看起来是很多开销。如果是这样,那么我必须检查每个对象是否包含错误。

有没有更好更简单的方法? :-)

谢谢,
罗伯特

最佳答案

要记住的重要一点是,简单 XML 应该能够遵循您可以使用类逻辑生成的任何结构。因此,您可以创建一个使用错误接口(interface)并应用装饰器模式的基类,以便将所有这些传递到具体的错误类,而无需任何实现对象知道它们已被赋予什么。

这可能没有意义。我只是告诉你怎么样...好吧...我刚刚离开并完全实现了我的想法,这是结果( full code link ):

主文件:

package com.massaiolir.simple.iface;

import java.io.File;

import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;

public class Main {
public static void main(String[] args) throws Exception {
Serializer serial = new Persister();
ResC resc = serial.read(ResC.class, new File("data/testdata.xml"));

System.out.println(" == Printing out all of the error text. == ");
System.out.println(resc.getErrorText());
System.out.println(resc.conRes.getErrorText());
System.out.println(resc.conRes.conList.getErrorText());
for (Con con : resc.conRes.conList.cons) {
System.out.println(con.getErrorText());
}
System.out.println(" == Finished printing out all of the error text. == ");
}
}

它只是简单地运行并显示结果。

BaseObject.java 类:

package com.massaiolir.simple.iface;

import org.simpleframework.xml.Element;

public class BaseObject implements Error {
@Element(name = "Err", required = false, type = ConcreteError.class)
private Error err;

@Override
public String getErrorText() {
return err.getErrorText();
}

@Override
public void setErrorText(String errorText) {
err.setErrorText(errorText);
}
}

如果想要“Err”,那么所有东西都应该扩展这个类。

错误界面:

package com.massaiolir.simple.iface;

public interface Error {
void setErrorText(String errorText);

String getErrorText();
}

ConcreteError 类:

package com.massaiolir.simple.iface;

import org.simpleframework.xml.Attribute;

public class ConcreteError implements Error {
@Attribute
private String text;

@Override
public String getErrorText() {
return text;
}

@Override
public void setErrorText(String errorText) {
this.text = errorText;
}

}

实际的实现类在这一点之后。您会发现它们相当琐碎,因为真正的工作是在上面的类中处理的。

Con 类:

package com.massaiolir.simple.iface;

public class Con extends BaseObject {

}

ConList 类:

package com.massaiolir.simple.iface;

import java.util.ArrayList;

import org.simpleframework.xml.ElementList;

public class ConList extends BaseObject {
@ElementList(entry = "Con", inline = true)
public ArrayList<Con> cons;
}

ConRes 类:

package com.massaiolir.simple.iface;

import org.simpleframework.xml.Element;

public class ConRes extends BaseObject {
@Element(name = "ConList")
public ConList conList;
}

ResC 类:

package com.massaiolir.simple.iface;

import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;

@Root
public class ResC extends BaseObject {
@Element(name = "ConRes")
public ConRes conRes;
}

这就是全部内容了。很简单吧。我能在十分钟内把这一切搞定。实际上,我写这个回复所花费的时间比我编写给您的代码所花费的时间还要长。如果您对我刚刚编写的代码有任何不明白的地方,请告诉我。我希望这可以帮助您了解如何去做这样的事情。

关于java - 在 Simple 2.5.3 (Java) 中反序列化重复的 XML 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6197196/

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