2013-01-01 175 views
2

處理XSD當我有這樣零指示字例外使用xsom

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="www.aaa.com/aa" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="class.xsd"/> 
    <xs:element name="record"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Stud" minOccurs="0"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="fname" type="xs:string"/> 
          <xs:element name="lname" type="xs:string"/> 
          ........         
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

的XSD當我解析使用XSOM此XSD它給Null Pointer Exception。當我刪除​​元素,它工作正常

XSOMParser parser = new XSOMParser(); 
     parser.parse(inputStream);// -> this statement gives null pointer. 

堆棧跟蹤

Exception in thread "main" java.lang.NullPointerException 
    at com.sun.xml.xsom.impl.parser.NGCCRuntimeEx.parseEntity(NGCCRuntimeEx.java:327) 
    at com.sun.xml.xsom.impl.parser.NGCCRuntimeEx.includeSchema(NGCCRuntimeEx.java:234) 
    at com.sun.xml.xsom.impl.parser.state.includeDecl.action0(includeDecl.java:42) 
    at com.sun.xml.xsom.impl.parser.state.includeDecl.leaveElement(includeDecl.java:109) 
    at com.sun.xml.xsom.impl.parser.state.NGCCRuntime.endElement(NGCCRuntime.java:275) 
    at org.xml.sax.helpers.XMLFilterImpl.endElement(XMLFilterImpl.java:546) 
    at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source) 
    at org.apache.xerces.parsers.AbstractXMLDocumentParser.emptyElement(Unknown Source) 
    at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source) 
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source) 
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) 
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) 
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) 
    at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) 
    at org.xml.sax.helpers.XMLFilterImpl.parse(XMLFilterImpl.java:333) 
    at com.sun.xml.xsom.parser.JAXPParser.parse(JAXPParser.java:115) 
    at com.sun.xml.xsom.impl.parser.NGCCRuntimeEx.parseEntity(NGCCRuntimeEx.java:337) 
    at com.sun.xml.xsom.impl.parser.ParserContext.parse(ParserContext.java:124) 
    at com.sun.xml.xsom.parser.XSOMParser.parse(XSOMParser.java:183) 
    at com.sun.xml.xsom.parser.XSOMParser.parse(XSOMParser.java:138) 

在此先感謝

+0

嘗試單獨解析'class.xsd'。 – Azodious

+0

我使用相同的lib解析'class.xsd',它工作正常 –

+0

http://javasourcecode.org/html/open-source/jdk/jdk-6u23/com/sun/xml/internal/xsom/impl/parser /NGCCRuntimeEx.java.html ...在這裏你可以找到'NGCCRuntimeEx'類的源代碼。看看你是否可以調試它。 – Azodious

回答

4

爲什麼NullPointerException異常發生 的問題是,有沒有錯誤處理程序處理解析時拋出的異常,因此解析中的異常導致返回null。

將錯誤處理器設置爲org.xml.sax.ErrorHandler的實現實例解決了該問題。

parser.setErrorHandler(new DOMErrorHandler()); 

DOMErrorHandler是org.xml.sax.ErrorHandler的實現。

爲什麼XS:包括不工作

解析器解析指定XSDInputStream。因此它不會得到給定模式的systemId(),使用該模式必須創建baseURI來訪問包含的文件。因此它將無法訪問要包含的文件。

因此,當我呼叫parser.parse()與架構InputSource,它工作正常。