2011-06-27 112 views
1

我有一個基於XSD的XML。該XSD是JAXB創建空對象

<xs:complexType name="objectOneType" mixed="true"> 
    <xs:sequence> 
     <xs:element ref="nestedObject" minOccurs="0" maxOccurs="unbounded"/> 
    </xs:sequence> 
    <xs:attribute name="attribute" type="xs:string" use="optional"/> 
</xs:complexType> 

現在,當我收到此XML

<xmlresponse> 
    <xmlrequest> 
    <objectone attribute="changed" /> 
    </xmlrequest> 
    <xmlsrc> 
    <objectone attribute="changed" /> 
    </xmlsrc> 
</xmlresponse> 

在這個XML,對象OBjECTONE沒有名爲NESTEDOBJECT的對象。現在不是忽略它,而是插入一個空的對象在對象這是STRING類型。所以當我的代碼試圖處理OBJECTONE假設它有一個對象類型NESTEDOBJECT。它拋出classcast異常。

有什麼想法?

P.S:sicne我使用JAXB 1.2

+0

可能是一個愚蠢的說法,但是,在您的xsd中,您定義了一個名爲「objectOneType」的複雜類型,而您的xml具有「objectone」對象... – chahuistle

+0

我將xml從原始更改爲post tackoverflow。原始的xml/xsd沒有這些問題。 xml響應正在通過http://tools.decisionsoft.com/schemaValidate/results.jsp –

回答

2

的關鍵是註釋mixed="true"殺了我。有了這種註釋結構,如

<content> 
    <italic>Italic</italic> ist not <underline>underline</underline> 
</content> 

是可能的。內部JAXB創建List<Object> insideContent,其大小爲:String,ItalicString,UnderlineString。我假設您輸出的XML類似Marshaller.JAXB_FORMATTED_OUTPUT,它爲格式化輸出插入一個換行符和製表符。您可以:

  • 不要使用格式化輸出:在迭代的List<Object>
<content><italic>This</italic> is a <underline>test</underline></content>不應該有一個前導或尾隨 String
  • 不要使用mixed="true"
  • 測試你的孩子類instanceOf
  • +0

    針對XSD進行驗證。感謝您指出。我會試着要求其他團隊改變模式。同時,你能否告訴我** instanceof **可能具有哪些副作用?我使用這個檢查aliaedy。在這裏提出這個問題的理由是,由於我對JAXB瞭解得非常多,所以我想確定我的方法是否可行。 –

    +1

    對於一些使用情況,我也有'mixed =「true」',我不知道使用'instanceOf'有任何負面影響。由於'instanceOf'不是一個調用,而是一個JVM操作碼,所以你不能比它快。 – Thor