SimpleXML框架:带元素或文本的元素
我必须解析XML,它可以有两种forms:
要么:
some text
我怎样才能做到这一点? 当我尝试在类中声明负责Command
解析的@Element
和@Text
时,当我尝试将XML解析为此类的实例时抛出exception。
我当前的代码版本:
@Root(name = "Command", strict = false) public class AppCommand { @Element(name = "Variable", required = false) @Getter private Variable variable; @Text(required = false) @Getter private String content;
}
例外是: Text annotation @org.simpleframework.xml.Text(required=false, empty=, data=false) on field 'content' private java.lang.String com.example.AppCommand.content used with elements in class com.example.AppCommand
我的解决方案(不是很漂亮,但可以工作并且不需要太多工作来实现):
private static class SerializerWithPreprocessor extends Persister { public SerializerWithPreprocessor(RegistryMatcher matcher, Format format) { super(matcher, format); } @Override public T read(Class extends T> type, String source) throws Exception { source = source.replaceFirst(" ([[\\w||[+=]]&&[^<>]]+)", "$2 "); return super.read(type, source); } }
所以我刚刚创建了新的Serializer类。 此类使用正则表达式将Command
Text
元素更改为普通Element
。 然后我可以使用:
@Root(name = "Command", strict = false) public class AppCommand { @Element(name = "Variable", required = false) @Getter private Variable variable; @Element(name = "Content", required = false) @Getter private String content; }
在反序列化过程中,一切都像我想的那样。
是的,简单无法解决这个问题。
Command.java
:
import org.simpleframework.xml.Element; import org.simpleframework.xml.Root; import org.simpleframework.xml.Text; @Root public class Command { @Element(required = false, name = "Variable") private Variable variable; @Text(required = false) private String text; }
Variable.java
:
class Variable { }
SOPlayground.java
:
import org.simpleframework.xml.Serializer; import org.simpleframework.xml.core.Persister; public class SOPlayground { public static void main(String[] args) throws Exception { Serializer serializer = new Persister(); String xml1 = " "; String xml2 = " some text"; serializer.validate(Command.class, xml1); serializer.validate(Command.class, xml2); } }
这确实编译但它不运行:
Exception in thread "main" org.simpleframework.xml.core.TextException: Text annotation @org.simpleframework.xml.Text(data=false, required=false, empty=) on field 'text' private java.lang.String de.lhorn.so.Command.text used with elements in class de.lhorn.so.Command
看起来好像不能同时拥有@Element
和@Text
成员。