簡體   English   中英

SimpleXML框架:帶有元素或文本的元素

[英]SimpleXML framework: element with element or text

我必須解析XML,它可以有兩種形式:

<Command><Variable/></Command>

要么:

<Command>some text</Command>

我怎樣才能做到這一點? 當我嘗試在負責Command解析的類中聲明@Element@Text時,當我嘗試將XML解析為此類的實例時會引發異常。

我當前的代碼版本:

@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> T read(Class<? extends T> type, String source) throws Exception {
            source = source.replaceFirst("<Command (.*)>([[\\w||[+=]]&&[^<>]]+)</Command>", "<Command $1><Content>$2</Content></Command>");
            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;
}

在反序列化過程中,一切都按我的意願進行。

是的,Simple無法解決這個問題。

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 = "<Command><Variable/></Command>";
        String xml2 = "<Command>some text</Command>";

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM