0

希望这不是一个菜鸟问题。我正在尝试从 XML 的第二级将 XML 反序列化为 POJO,但是在搜索并尝试了许多与此类似的其他问题的答案之后,我仍在努力寻找适合该级别的东西。

XML(已提供但我无法更改)与此类似

<?xml version="1.0" encoding="UTF-8"?>
<ns0:InputRequest xmlns:ns0="OW">
    <ns0:FMan>
        <ns0:CInc>
            <ns0:Act>Sample</ns0:Act>
            <ns0:Op>Sample</ns0:Op>
            <ns0:Int>AppInt</ns0:Int>
        </ns0:CInc>
    </ns0:FMan>
</ns0:InputRequest>

我只需要将 CInc(永远只有一个)反序列化到我的 POJO 中,它看起来类似于

public class CInc extends InputRequest {

    @JacksonXmlProperty(namespace = "ns0", localName = "Act")
    private String action;

    @JacksonXmlProperty(namespace = "ns0", localName = "Op")
    private String operation;

    @JacksonXmlProperty(namespace = "ns0", localName = "Int")
    private String intName;

    // Usual Getters, Setters, etc

}

我正在扩展一个抽象的顶级类,如下

@JacksonXmlRootElement(namespace = "ns0", localName = "InputRequest")
public class InputRequest { }

我的 Java 代码看起来类似于

XmlMapper xmlMapper = new XmlMapper();
CInc cInc = xmlMapper.readValue(content, CInc.class);

由于缺少 FMan 元素,此操作失败。

从另一个答案中,我尝试像这样禁用 FAIL_ON_UNKNOWN_PROPERTIES

XmlMapper xmlMapper = new XmlMapper();
xmlMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
CInc cInc = xmlMapper.readValue(content, CInc.class);

这消除了失败,但 POJO 中的所有值都是空的。

我还尝试为扩展“InputRequest”的“FMan”元素放置另一个抽象类,然后将 CInc 更改为扩展 FMan,即

public class FMan extends InputRequest {
...

public class CInc extends FMan {
...

但这根本没有帮助。我觉得答案是我想念的愚蠢的东西,但我真的很难得到答案,所以任何帮助将不胜感激。

4

2 回答 2

0

您可以使用 SimpleXml 来完成。添加这个 POJO;

@XmlName("ns0:CInc")
public class Cinc {
    @XmlName("ns0:Act")
    public String act;
    @XmlName("ns0:Op")
    public String op;
    @XmlName("ns0:Int")
    public String Int;
}

接下来是反序列化和打印输出的代码:

public static void main(final String... args) throws InvalidXPath, IOException {
    final SimpleXml simple = new SimpleXml();
    final Cinc c = simple.fromXml(xml, "ns0:InputRequest/ns0:FMan/ns0:CInc", Cinc.class);
    System.out.println(c.act + " - " + c.op + " - " + c.Int);
}

这将打印:

Sample - Sample - AppInt

SimpleXml 在 Maven 中心:

<dependency>
    <groupId>com.github.codemonstur</groupId>
    <artifactId>simplexml</artifactId>
    <version>2.0.0</version>
</dependency>
于 2018-09-15T11:47:05.293 回答
0

我知道它使用了 Jackson,必须序列化,换句话说,扩展序列化并具有私有序列版本 ID 属性,对于 Super Class 也是如此。

 public class CInc extends InputRequest,serialize {
    private final long serialVersionUID = 1L;
    *****
}
于 2018-09-09T02:47:08.237 回答