2012-01-06 30 views
6

JAXBと検証の初心者です。この問題を解消するために数時間を費やしています。 XMLファイルを解析するための簡単なJAXB unmarshallerサンプルを作成しました。私は適切なXSDファイルも作成しましたが、バリデーターは要素の宣言を見つけることができないと不満を持ち続けます。JAXB unmarshal validation throws cvc-elt.1:要素エラーの宣言が見つかりません

私はそれが名前空間の問題に関連しているかもしれないと思うが、私は考えることができるすべてを試しても、エラーを解決できないようだ。私の知る限りでは、XSDとXMLは適切なので、アンマーシャラーをインスタンス化する方法と関係があるかもしれませんが、どこでも問題を見つけることはできません。

私は入れませんエラー/例外がある:ここでは

Caused by: org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'calculateBorrowingDataResponse'. 
    at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source) 
    at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source) 
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) 
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) 
    at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source) 
    at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source) 
    at org.apache.xerces.jaxp.validation.ValidatorHandlerImpl.startElement(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.ValidatingUnmarshaller.startElement(ValidatingUnmarshaller.java:85) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(InterningXmlVisitor.java:47) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:113) 
    at com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:236) 
    at com.sun.xml.internal.bind.unmarshaller.DOMScanner.scan(DOMScanner.java:119) 
    at com.sun.xml.internal.bind.unmarshaller.DOMScanner.scan(DOMScanner.java:102) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:299) 
    ... 2 more 

は、エラーの原因となっているソースファイルがあります。

Javaコード:

// We need a Document 
InputStream is = UnmarshalTest.class.getClassLoader().getResourceAsStream("calculateBorrowingDataResponse.xml"); 
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
DocumentBuilder db = dbf.newDocumentBuilder(); 
Node node = db.parse(is); 

// Creating an unmarshaller 
Unmarshaller u = JAXBContext.newInstance(CalculateBorrowingDataResponseType.class).createUnmarshaller(); 

// Setting the Validation 
Schema schema; 
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
schema = schemaFactory.newSchema(new File("src/main/webapp/WEB-INF/wsdl/CalculateBorrowingDataResponse.xsd")); 
u.setSchema(schema); 
u.unmarshal(node, CalculateBorrowingDataResponseType.class); 

CalculateBorrowingDataResponse.xsd:

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema 
    version="1.1" 
    attributeFormDefault="unqualified" 
    elementFormDefault="qualified" 
    targetNamespace="http://www.domain.com/ClientServices/LendingSimulation/CalculateBorrowingDataResponse" 
    xmlns:lssSt="http://www.domain.com/ClientServices/LendingSimulation/CalculateBorrowingDataResponse" 
    xmlns:cbdRes="http://www.domain.com/ClientServices/LendingSimulation/CalculateBorrowingDataResponse" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 


    <!-- CalculateBorrowingData --> 
    <xsd:complexType name="CalculateBorrowingDataResponseType"> 
     <xsd:sequence> 
      <xsd:element name="loanAgmt" type="cbdRes:LoanAgreementType" minOccurs="1" maxOccurs="1" /> 
     </xsd:sequence> 
    </xsd:complexType> 


    <xsd:complexType name="LoanAgreementType"> 
     <xsd:sequence> 
      <xsd:element name="borrowingBasedPmtAmt" type="lssSt:borrowingBasedPmtAmt" minOccurs="0" maxOccurs="1" /> 
      <xsd:element name="maxPmtAmt" type="lssSt:maxPmtAmt" minOccurs="0" maxOccurs="1" /> 
      <xsd:element name="borrowingCapacityMin" type="lssSt:borrowingCapacityMin" minOccurs="0" maxOccurs="1" /> 
      <xsd:element name="borrowingCapacityMax" type="lssSt:borrowingCapacityMax" minOccurs="0" maxOccurs="1" /> 
      <xsd:element name="propertyValueMinAmt" type="lssSt:propertyValueMinAmt" minOccurs="0" maxOccurs="1" /> 
      <xsd:element name="propertyValueMaxAmt" type="lssSt:propertyValueMaxAmt" minOccurs="0" maxOccurs="1" /> 
     </xsd:sequence> 
    </xsd:complexType> 

    <xsd:element name="calculateBorrowingDataResponse" type="cbdRes:CalculateBorrowingDataResponseType"/> 


    <xsd:simpleType name="borrowingBasedPmtAmt"> 
     <xsd:restriction base="xsd:decimal" > 
     <xsd:totalDigits value="19" /> 
     <xsd:fractionDigits value="4" /> 
     </xsd:restriction> 
    </xsd:simpleType> 
    <xsd:simpleType name="maxPmtAmt"> 
     <xsd:restriction base="xsd:decimal" > 
     <xsd:totalDigits value="19" /> 
     <xsd:fractionDigits value="4" /> 
     </xsd:restriction> 
    </xsd:simpleType> 
    <xsd:simpleType name="borrowingCapacityMin"> 
     <xsd:restriction base="xsd:decimal" > 
     <xsd:totalDigits value="19" /> 
     <xsd:fractionDigits value="4" /> 
     </xsd:restriction> 
    </xsd:simpleType> 
    <xsd:simpleType name="borrowingCapacityMax"> 
     <xsd:restriction base="xsd:decimal" > 
     <xsd:totalDigits value="19" /> 
     <xsd:fractionDigits value="4" /> 
     </xsd:restriction> 
    </xsd:simpleType> 
    <xsd:simpleType name="propertyValueMinAmt"> 
     <xsd:restriction base="xsd:decimal" > 
     <xsd:totalDigits value="19" /> 
     <xsd:fractionDigits value="4" /> 
     </xsd:restriction> 
    </xsd:simpleType> 
    <xsd:simpleType name="propertyValueMaxAmt"> 
     <xsd:restriction base="xsd:decimal" > 
     <xsd:totalDigits value="19" /> 
     <xsd:fractionDigits value="4" /> 
     </xsd:restriction> 
    </xsd:simpleType> 
</xsd:schema> 

calculateBorrowingDataResponse.xml

<?xml version="1.0" encoding="UTF-8"?> 
<calculateBorrowingDataResponse 
    xmlns="http://www.domain.com/ClientServices/LendingSimulation/CalculateBorrowingDataResponse" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:ns2="http://www.domain.com/ClientServices/LendingSimulation/V1.1"> 
    <loanAgmt> 
     <borrowingBasedPmtAmt>1231231</borrowingBasedPmtAmt> 
     <maxPmtAmt>987654321</maxPmtAmt> 
     <borrowingCapacityMax>99999</borrowingCapacityMax> 
    </loanAgmt> 
</calculateBorrowingDataResponse> 

私は、XSD内の最後の要素の定義ととせずに、両方試してみました(つまり、 :xsd:element name = "calculateBorrowingDataResponse" ...)しかしどちらも動作しません。

私は試してみるためにさまざまなアイデアが不足しています。どんな提案や勧告も大歓迎です!

+0

JAXBクラスを手作業で作成したか、またはXJCで作成しましたか?また、あなたが参照している* SimpleType.xsd *は何ですか?これらの情報がなければ、迅速なテストを実行するのは難しいです。 –

+0

はい - XJCでクラスを生成しました。私は実際にXJCとeclipseプラグインの両方を使ってみました(paxのjaxb実装としてmaven中心のjaxb-2.1.9-osgiを使用しています)。私は両方の方法で同じエラーが発生します。 私は上記の質問を編集し、元のXSDスキーマをSimpleType.xsdの関連するタイプを含む新しいバージョンに置き換えました。そのため、スキーマファイルは1つしかなく、SimpleType.xsdに依存しません。しかし、分かりやすくするために、私は元の名前空間識別子を残しました。 –

+0

私の投稿を編集して、calculateBorrowingDataResponse.xmlサンプルデータの定義を追加しました。 –

答えて

22

これは、問題の原因を見つけようとしているの第4の時間です。たくさんの苦労の末、今度はのコードの1行が欠けていると確信しています。

問題は、デフォルトDocumentBuilderFactory.newInstance()を使用して作成DocumentBuilderFactoryが意識 -yeahを名前空間されていないということです。

次の2つの方法でこれを克服することができます:非整列化しながら、

DocumentBuilderFactory.setNamespaceAware(true);

  • StreamSourceを使用し、完全にDocumentBuilderと彼の小さな友人をドロップ:

    1. は、あなたのDocumentBuilderFactory名前空間を認識させます:

      Unmarshaller.unmarshal(StreamSource, Class<T>);

    2番目の選択肢の場合は、このようにする必要があります。ところで

    InputStream xsdStream = ... 
    InputStream xmlStream = ... 
    
    SchemaFactory f = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    Schema s = schemaFactory.newSchema(xsdStream); 
    
    JAXBContext c = JAXBContext.newInstance(CalculateBorrowingDataResponseType.class); 
    Unmarshaller u = c.createUnmarshaller(); 
    u.setSchema(schema); 
    CalculateBorrowingDataResponseType b = 
        u.unmarshal(new StreamSource(xmlStream), CalculateBorrowingDataResponseType.class); 
    

    は、このスキーマ意識ネス・ドキュメント・builderness-素晴らしUnmarshaller class' documentationの上部のセクションでたくさん情報があり、あなたは間違いなくそれをチェックアウトする必要があります!

  • +0

    うわー。これに多くの時間を費やしてくれてありがとう、ありがとう。私はこれに8時間以上を費やしましたが、最初は解決するのが私の問題でした。もしあなたがもっとあなたにアップアップすることができたら、私はそうするでしょう。私は同じ結論に至ったと思います。私は、DocumentBuilderFactoryがデフォルトで名前空間を認識していないことに気づいていないし、さらにそのような違いがあるとは考えていませんでした。私はDOMUtils(http://www.java2s.com/Code/Java/XML/ComparetwoDOMNodes.htm)というクラスを見つけたときに私は結びつきました。 –

    +1

    @EricB。 _私は、DocumentBuilderFactoryがデフォルトでネームスペースを認識していないことに気付きませんでした。さらに、私はそれがこのような違いになるとは考えていませんでした。しかし、私たちにとっては良いレッスンでした。将来は。 :) –

    +0

    すべての助けに感謝します。残念ながら、私のJaxBの問題は続きます。類似の静脈であるが、異なる問題。今回は、JAXB生成クラスからのスキーマ生成が不完全です。任意の提案をいただければ幸いです。私は別の問題として新しいスレッドを作成しました。 http://stackoverflow.com/questions/8809406/jaxbcontext-generating-incomplete-schemas –

    関連する問題