【问题标题】:xml unmarshalling questionsxml 解组问题
【发布时间】:2016-01-27 22:24:41
【问题描述】:

现在,xml 如下所示:

<db>
 <type1>
   <data1>...</data1>
   <data2>...</data2>
          ...
   <data7>...</data7>
 </type1>
 <type2>
   <meta1>...</meta1>
   <meta2>...</meta2>
          ...
   <meta9>...</meta9>
 </type2>
.....
</db>

这个xml只包含几个type1和type2的信息。我希望解组这个xml文件,只需要type1的data1、data3、data5和type2的meta1、meta4、meta6。

对于type1,每个type1都包含data1、data3和data5,但可能不包含data2、data4、data6、data7。

对于type2,每个type1都包含meta1、meta4和meta6,但可能不包含meta2、meta3、meta5、meta7、meta8、meta9。 我有三个问题:

  1. 如何处理这个 xml 文件中的两种类型?定义两个类?

  2. 不知道怎么解决data2,data4,data6,data7可能没有出现在这个xml文件中的问题。

  3. 我需要两个定义两个列表来保存结果吗?因为像type1和type2这样的标签很多。

谁能给我一些学习的链接?我找到了很多,但它们没有帮助。谢谢!!!

【问题讨论】:

    标签: java xml jaxb unmarshalling


    【解决方案1】:

    如果您想解组,这意味着映射到特定的 Java 类,在这种情况下,type1type2 将是不同的类。

    如果您想要更动态的东西,其中 type1type2 不是实际的 Java 类,那么您说的是 解析,而不是解组,在这种情况下,您应该查看 DOM或 StAX。

    对于编组,您可以指定如下内容(为简洁起见,省略了 getter 和 setter):

    @XmlRootElement(name="db")
    public class Db {
        @XmlElement(required=true) private Type1 type1;
        @XmlElement(required=true) private Type2 type2;
    }
    
    public class Type1 {
        @XmlElement(required=true ) private String data1;
        @XmlElement(required=false) private String data2;
        @XmlElement(required=true ) private String data3;
        @XmlElement(required=false) private String data4;
        @XmlElement(required=true ) private String data5;
        @XmlElement(required=false) private String data6;
        @XmlElement(required=false) private String data7;
    }
    
    public class Type2 {
        @XmlElement(required=true ) private String meta1;
        @XmlElement(required=false) private String meta2;
        @XmlElement(required=false) private String meta3;
        @XmlElement(required=true ) private String meta4;
        @XmlElement(required=false) private String meta5;
        @XmlElement(required=true ) private String meta6;
        @XmlElement(required=false) private String meta7;
        @XmlElement(required=false) private String meta8;
        @XmlElement(required=false) private String meta9;
    }
    

    在上面运行 schemagen 会生成以下 XSD 文件:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    
      <xs:element name="db" type="db"/>
    
      <xs:complexType name="db">
        <xs:sequence>
          <xs:element name="type1" type="type1"/>
          <xs:element name="type2" type="type2"/>
        </xs:sequence>
      </xs:complexType>
    
      <xs:complexType name="type1">
        <xs:sequence>
          <xs:element name="data1" type="xs:string"/>
          <xs:element name="data2" type="xs:string" minOccurs="0"/>
          <xs:element name="data3" type="xs:string"/>
          <xs:element name="data4" type="xs:string" minOccurs="0"/>
          <xs:element name="data5" type="xs:string"/>
          <xs:element name="data6" type="xs:string" minOccurs="0"/>
          <xs:element name="data7" type="xs:string" minOccurs="0"/>
        </xs:sequence>
      </xs:complexType>
    
      <xs:complexType name="type2">
        <xs:sequence>
          <xs:element name="meta1" type="xs:string"/>
          <xs:element name="meta2" type="xs:string" minOccurs="0"/>
          <xs:element name="meta3" type="xs:string" minOccurs="0"/>
          <xs:element name="meta4" type="xs:string"/>
          <xs:element name="meta5" type="xs:string" minOccurs="0"/>
          <xs:element name="meta6" type="xs:string"/>
          <xs:element name="meta7" type="xs:string" minOccurs="0"/>
          <xs:element name="meta8" type="xs:string" minOccurs="0"/>
          <xs:element name="meta9" type="xs:string" minOccurs="0"/>
        </xs:sequence>
      </xs:complexType>
    </xs:schema>
    

    【讨论】:

      猜你喜欢
      • 2014-09-18
      • 1970-01-01
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多