java - 将 XML 解码为 Java 对象

标签 java xml jaxb jax-rs

下面是我的 REST 服务假设使用的 XML 结构。我正在使用 JAX-RS 来创建服务。我无法实现这一目标。

我尝试了很多东西。现在我面临两个问题。 1)当请求中涉及命名空间时,我无法将此 xml 映射到 java 类。 2) 当有多个根标签时获取 null(Invoke_Service、part、GData)。如果只有部分标签,那么它的工作。

任何人都可以在这里帮助我吗?引导我找到正确的文档或示例。帮助我理解这一点。

<Invoke_Service>
 <part xmlns="http://www.examplone.com" name="param">
    <GData xmlns:oracle-xls-mapper="http://www.oracle.com/xsl/mapper/schemas"
           xmlns:aia-xls-mapper="http://www.oracle.com/xsl/Transform/java"
           xmlns:impl="http://exampletwo.com" xmlns="http://exampletwo.com">
        <impl:sProduct>
           <impl:productName>Machine</impl:productName>
           <impl:Customer>
              <item>
                 <impl:cus_name>James</impl:cus_name>   
                 <impl:cus_age>22</impl:cus_age>
              </item>
               <item>
                 <impl:cus_name>Johnny</impl:cus_name>   
                 <impl:cus_age>25</impl:cus_age>
              </item>
           </impl:Customer>
        </impl:sProduct>
       <impl:sProduct>
           <impl:productName>Machine2</impl:productName>
           <impl:Customer>
              <item>
                 <impl:cus_name>Dianna</impl:cus_name>   
                 <impl:cus_age>29</impl:cus_age>
              </item>
               <item>
                 <impl:cus_name>Daisy</impl:cus_name>   
                 <impl:cus_age>40</impl:cus_age>
              </item>
           </impl:Customer>
        </impl:sProduct>
       <impl:sProduct>
           <impl:productName>Machine3</impl:productName>
           <impl:Customer>
              <item>
                 <impl:cus_name>Sam</impl:cus_name>   
                 <impl:cus_age>50</impl:cus_age>
              </item>
               <item>
                 <impl:cus_name>Rocky</impl:cus_name>   
                 <impl:cus_age>30</impl:cus_age>
              </item>
           </impl:Customer>
        </impl:sProduct>
    </GData>
 </part>
</Invoke_Service>

我感谢我能得到的所有帮助。

最佳答案

您可以使用Declarative Stream Mapping (DSM)流解析库可轻松将复杂的 xml 转换为 java 类。

首先,您必须以 yaml 格式定义 xml 数据和类字段之间的映射。

这里是 xml 的映射定义。我想您想获取产品列表。

DSM 忽略命名空间。

result:     
   type: array
   path: /.+GData/sProduct  # path is regex. you don't need to define all path.
   fields:
     productName: 
        path: productName  # DSM ignore namespace
     customers:
        type: array
        path: Customer/item
        fields: 
          name: 
            path: cus_name
          age: 
            path: cus_age

要反序列化的 POJO 类:

public class Product {
    public String productName;
    public List<Customer> customers;



    @Override
    public String toString() {
        return "Product [productName=" + productName + ", customers=" + customers + "]";
    }



    public static class Customer{
        public String name; 
        public int age;
        @Override
        public String toString() {
            return "Customer [name=" + name + ", age=" + age + "]";
        } 


    }

}

解析 XML 的 Java 代码:

DSM dsm=new DSMBuilder(new File("path/to/mapping.yaml")).setType(DSMBuilder.TYPE.XML).create(Product.class);
List<Product> itemList =  (List<Product>>)dsm.toObject(xmlFileContent);
System.out.println(object);

这是输出:

[Product [productName=Machine, customers=[Customer [name=James, age=22], Customer [name=Johnny, age=25]]], Product [productName=Machine2, customers=[Customer [name=Dianna, age=29], Customer [name=Daisy, age=40]]], Product [productName=Machine3, customers=[Customer [name=Sam, age=50], Customer [name=Rocky, age=30]]]]

关于java - 将 XML 解码为 Java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55983357/

相关文章:

java - GridLayout 单元格真的都是相同大小吗?

java - Spring Boot 中对多 RabbitMq 虚拟主机的动态支持

Java Apache FTP 服务器崩溃

java - 当我调用 Web 服务 GET 请求时没有响应

Java Dom 获取属性

java - 如何在 kotlin 中模拟相同的行为

android - 新建 Material 库 : Center icon, 上面文字里面的按钮

java - JaxB 编码通配符泛型扩展类

Java:JAXBElement 的 QName,没有命名空间或前缀? (使用matlab)

java - xjc 和 XSD 的选择