无法使用 Camel JacksonXML 解组 XML

发布于 2025-01-18 00:26:08 字数 2641 浏览 3 评论 0原文

我正在尝试简单地将XML文件删除如下:

<?xml version="1.0" encoding = "UTF-8" ?>
<feed xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <products>
        <product>
            <facet type="string" elementType="string" name="Weight (g)"><![CDATA[210]]></facet>
        </product>
    </products>
</feed>

我有此类:

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@XmlRootElement(name = "feed")
@XmlAccessorType(XmlAccessType.FIELD)
public class Feed {
    private Products products;
}

子类products

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Products {
    private List<Product> products;
}

子类product

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
public class Product {

    @XmlElement(name = "facet")
    private List<Facet> facet;
}

最后facet> facet

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
public class Facet {
    @XmlElement(name = "name")
    private String name;

    @XmlElement(name = "type")
    private String type;

    @XmlElement(name = "elementType")
    private String elementType;

    private String content;
}

我写信给Unmarshall的骆驼路线如下:

@Component
public class XMLSplitterRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {

        from("file:src/main/resources/files/xml").routeId("xmlUmarshaller")
            .log("body: ${body}")
            .unmarshal().jacksonXml(Products.class)
                .log("The unmarshalled object is ${body}")
            .marshal().json()
            .to("activemq:json-marshal-queue");
    }
}

但是我一直在下面遇到错误:

com.fasterxml.jackson.databind.JsonMappingException: Unexpected non-whitespace text ('210' in Array context: should not occur (or should be handled)
 at [Source: (BufferedInputStream); line: 29, column: 96] (through reference chain: com.sammy.model.Products["products"]->java.util.ArrayList[0]->com.sammy.model.Product["facet"])

Caused by: com.fasterxml.jackson.core.JsonParseException: Unexpected non-whitespace text ('210' in Array context: should not occur (or should be handled)
 at [Source: (BufferedInputStream); line: 29, column: 96]

意味着,似乎不知道该如何处理XML文件的CDATA中的值!我到处都是,但没有看到任何潜在的解决方案。请帮忙!!!

I'm trying to simply unmarshal an XML file as below:

<?xml version="1.0" encoding = "UTF-8" ?>
<feed xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <products>
        <product>
            <facet type="string" elementType="string" name="Weight (g)"><![CDATA[210]]></facet>
        </product>
    </products>
</feed>

I've got this classes:

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@XmlRootElement(name = "feed")
@XmlAccessorType(XmlAccessType.FIELD)
public class Feed {
    private Products products;
}

Subclass Products:

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Products {
    private List<Product> products;
}

Subclass Product:

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
public class Product {

    @XmlElement(name = "facet")
    private List<Facet> facet;
}

And finally Facet:

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
public class Facet {
    @XmlElement(name = "name")
    private String name;

    @XmlElement(name = "type")
    private String type;

    @XmlElement(name = "elementType")
    private String elementType;

    private String content;
}

The camel route I've written to unmarshall is as below:

@Component
public class XMLSplitterRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {

        from("file:src/main/resources/files/xml").routeId("xmlUmarshaller")
            .log("body: ${body}")
            .unmarshal().jacksonXml(Products.class)
                .log("The unmarshalled object is ${body}")
            .marshal().json()
            .to("activemq:json-marshal-queue");
    }
}

But I keep getting the error below:

com.fasterxml.jackson.databind.JsonMappingException: Unexpected non-whitespace text ('210' in Array context: should not occur (or should be handled)
 at [Source: (BufferedInputStream); line: 29, column: 96] (through reference chain: com.sammy.model.Products["products"]->java.util.ArrayList[0]->com.sammy.model.Product["facet"])

and

Caused by: com.fasterxml.jackson.core.JsonParseException: Unexpected non-whitespace text ('210' in Array context: should not occur (or should be handled)
 at [Source: (BufferedInputStream); line: 29, column: 96]

This means, it seems not to know what to do with the value within the cdata of the XML file! I've looked everywhere but not seen any potential solution. Please, help!!!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

℡寂寞咖啡 2025-01-25 00:26:08

从尼古拉斯·菲洛托(Nicolas Filotto)的不错的建议中,我首先将XML转换为XSD,然后使用XJC生成POJO,修复了我的映射。
对于Camel unmarshal过程,我将其从JackSonXML更改为使用JAXB转换器。

@Component
public class XMLSplitterRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {

        DataFormat jaxb = new JaxbDataFormat("com.sammy.model");

        from("file:src/main/resources/files/xml").routeId("xmlSplitter")
            .log("body: ${body}")
            .unmarshal(jaxb)
                .log("The unmarshalled object is ${body}")
    }
}

现在,这就像魅力一样!!!

From the nice suggestiongs of Nicolas Filotto, I fixed my mappings by first converting my XML to XSD then generated the POJO's using xjc.
For Camel unmarshal process, I changed it from jacksonXML to use Jaxb converter.

@Component
public class XMLSplitterRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {

        DataFormat jaxb = new JaxbDataFormat("com.sammy.model");

        from("file:src/main/resources/files/xml").routeId("xmlSplitter")
            .log("body: ${body}")
            .unmarshal(jaxb)
                .log("The unmarshalled object is ${body}")
    }
}

This now works like a charm!!!

北方的巷 2025-01-25 00:26:08

我遇到了同样的问题。
我已经通过添加 @jsonproperty @jacksonxmlelementwrapper(usewrappapping = false)添加 @jsonproperty
这是类的示例:

@Getter
@JacksonXmlRootElement(localName = "users")
private static class Users {
    @JacksonXmlElementWrapper(useWrapping = false)
    @JsonProperty("user")
    List<User> users;

    @Getter
    @JacksonXmlRootElement(localName = "user")
    public static class User {
        @JacksonXmlProperty(isAttribute = true)
        private String key;

        @JacksonXmlText
        private String value;
    }
}

与XML相同,例如:

<users>
   <user key="a">111</user>
   <user key="b">222</user>
   <user key="c">333</user>
</users>

I've had the same issue.
I've solved it with adding @JsonProperty and @JacksonXmlElementWrapper(useWrapping = false) to my list.
Here is example of class:

@Getter
@JacksonXmlRootElement(localName = "users")
private static class Users {
    @JacksonXmlElementWrapper(useWrapping = false)
    @JsonProperty("user")
    List<User> users;

    @Getter
    @JacksonXmlRootElement(localName = "user")
    public static class User {
        @JacksonXmlProperty(isAttribute = true)
        private String key;

        @JacksonXmlText
        private String value;
    }
}

This works great with xml like:

<users>
   <user key="a">111</user>
   <user key="b">222</user>
   <user key="c">333</user>
</users>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文