我有以下XML结构:
<key>
<element>
someValue
</element>
<!-- lots of other elements which should be deserialized into the class -->
<other>
someOtherValue
</other>
</key>
我使用Simple将其反序列化为以下Java类:
@Root(name = "key", strict = false)
public class Key {
@Element(name = "element")
private String element;
// lots of more fields should be deserialized from xml
}
请注意,该类没有other
元素的字段。我在课堂上不需要它的价值,但在其他地方。我如何拦截解析并提取此other
元素的值?
答案 0 :(得分:0)
答案 1 :(得分:0)
我认为Strategy
方法不起作用,因为它们使用带注释的类作为XML模式,以及未处理的模式中不存在的内容(访问者无法访问)。 / p>
转换器可以按如下方式使用:
@Root(name = "key", strict = false)
@Convert(KeyConverter.class)
public class Key {
private String element;
public Key(String elementValue) {
element = elementValue;
}
}
转换器在转换期间存储值:
public class KeyConverter implements Converter<Key> {
private String otherValue;
@Override
public Key read(InputNode node) throws Exception {
String elementValue = node.getNext("element").getValue().trim();
otherValue = node.getNext("other").getValue().trim();
return new Key(elementValue);
}
@Override
public void write(OutputNode arg0, Key arg1) throws Exception {
throw new UnsupportedOperationException();
}
/**
* @return the otherValue
*/
public String getOtherValue() {
return otherValue;
}
}
汇总:
Registry registry = new Registry();
KeyConverter keyConverter = new KeyConverter();
registry.bind(Key.class, keyConverter);
Persister serializer = new Persister(new RegistryStrategy(registry));
Key key = serializer.read(Key.class, this.getClass().getResourceAsStream("key.xml"));
// Returns the value "acquired" during the last conversion
System.out.println(keyConverter.getOtherValue());
这不是太优雅,但可能适合您的需要。
答案 2 :(得分:0)
我建议使用Stragegy
或Converter
ng 和 Katona 来解决问题。但是,我做了一个解决方法,虽然有效但不太好。
/* package */ class SerializedKey extends Key {
@Element(name = "other", required = false)
private int mOtherValue;
public int getOtherValue() {
return mOtherValue;
}
}
...
Serializer serializer = new Persister();
SerializedKey key = serializer.read(SerializedKey.class, mInputStream);
int otherValue = key.getOtherValue();
在序列化包之外,我使用Key
作为静态类型,所以我只是忘记另一个字段在该对象中。当我保留我的数据时,我也会持续Key
,因此mOtherValue
不再与该课程相关联。正如您所看到的,SerializedKey
类是package-private,因此我不会将此帮助程序类公开给我的应用程序的任何其他组件。