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 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成员。