确定派生类中xml混合内容的顺序

时间:2014-04-01 18:30:45

标签: jaxb xjc

我有这样的架构:

<xsd:complexType name="ContentType" mixed="true">
      <xsd:annotation>
         <xsd:documentation><![CDATA[ 
            The content type is a broad base type allowing any content.
         ]]></xsd:documentation>
      </xsd:annotation>
      <xsd:complexContent>
         <xsd:extension base="BaseContentType">
            <xsd:sequence>
               <xsd:any minOccurs="0" maxOccurs="unbounded" namespace="##any" processContents="lax"
               />
            </xsd:sequence>
            <xsd:attribute name="orientation" type="OrientationEnum" use="optional"
               default="portrait">
               <xsd:annotation>
                  <xsd:documentation><![CDATA[
                  The @orientation attribute is used to specify a "landscape" 
                  orientation for the published form. This is primarily used
                  for schedules or for tables.                  
                  ]]></xsd:documentation>
               </xsd:annotation>
            </xsd:attribute>
         </xsd:extension>
      </xsd:complexContent>
   </xsd:complexType>

我使用xjc命令行工具从上面的模式生成Java类,并按如下方式生成类:

public abstract class BaseContentType {

    @XmlMixed
    protected List<Serializable> content;
    @XmlAttribute(name = "id")
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    @XmlID
    @XmlSchemaType(name = "ID")
    protected String id;

public class ContentType
    extends BaseContentType
{

    @XmlMixed
    @XmlAnyElement(lax = true)
    @OverrideAnnotationOf
    protected List<Object> contentOverrideForContentType;

当我取消编组时,所有嵌套的xml元素都会填充在contentOverrideForContentType对象的列表ContentType中,并且所有文本元素都会填充在content的{​​{1}}列表中}。

如何确定文本元素相对于嵌套元素的顺序并构造整个文本?

我试图在BaseContentType中获取整个文本,我必须查看顶级文本和所有嵌套标记的文本并将它们全部组合(这是我需要知道的顺序)。有没有更好的方法来从ContentType中提取所有文本?

谢谢!

修改 这与this问题有关。

2 个答案:

答案 0 :(得分:0)

如果在特定的jaxB类上声明propOrder,则可以指定对象在xml中出现的顺序

e.g. 
@XmlType(propOrder = {
        "firstObjectName",
        "fsecondObjectName"
    })

注意:使用propOrder时,必须将对象中的所有元素添加到propOrder中。

答案 1 :(得分:0)

我有同样的问题,我发现元素将按照元素添加到列表的顺序排序...这假设您使用的是有序列表(var sampleClosure = { [weak self] in guard let strongSelf = self else{ return } strongSelf.doSomething() strongSelf.doOtherThings() } List ...)