0

我正在使用 XMLMapper 反序列化 AIML 代码(大部分与 XML 相同),当我在同一个标​​签下混合文本和标签时遇到了这个问题。例子:

<set name="setVar">
  <srai>FUNCTION1</srai>
  <srai>FUNCTION2<star index="1"/></srai>
</set>

我的java类定义是:

@JacksonXmlRootElement(localName = "set")
public class Set {
    @JacksonXmlProperty(isAttribute = true, localName = "name")
    public String name;
    @JacksonXmlElementWrapper(useWrapping = false)
    @JacksonXmlProperty(localName = "srai")
    public List<Srai> srais;

    public Set() {
    }

    public Set(String name, List<Srai> srais) {
        this.name = name;
        this.srais = srais;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Srai> getSrais() {
        return srais;
    }

    public void setSrais(List<Srai> srais) {
        this.srais = srais;
    }
}

@JacksonXmlRootElement(localName = "srai")
public class Srai {
    @JacksonXmlElementWrapper(useWrapping = false)
    @JacksonXmlProperty(localName = "star")
    public List<Star> stars;
    @JacksonXmlText
    public String text;
    
    public Srai() {}
    
    public Srai(String text, List<Star> stars) {
        this.text = text;
        this.stars = stars;
    }

    public String getText() {
        return text;
    }

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

    public List<Star> getStars() {
        return stars;
    }

    public void setStars(List<Star> stars) {
        this.stars = stars;
    }
}

@JacksonXmlRootElement(localName = "star")
public class Star {
    @JacksonXmlProperty(isAttribute = true)
    public int index;
    
    public Star() {
    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }
}

如果我尝试反序列化其中只有文本或只有星星进入srai的代码,一切正常,当我混合文本和标签时会出现问题。

4

1 回答 1

0

我终于设法解决了它,将我的 jackson-databind、jackson-core、jackson-annotation 和 jackson-dataformat-xml 升级到 tnci 建议的版本2.12.1

为此,只需将它们的版本更改为 pom.xml 到 2.12.1 或更高版本。

然后我在类中创建了一个新属性:

@JacksonXmlText
public String text;

这样,当 xml 标记之前或之间有文本时,它将保存在对象的此属性中。如果文本后面都是xml标签,就会出现这个问题:

Unexpected end-of-input when trying read value of type `**root-agent-class**`

所以问题仍然存在,但现在好多了,因为我们可以阅读一些文本+标签代码。

于 2021-07-19T06:53:31.283 回答