java - 使用xsom处理XSD时出现空指针异常

标签 java xsd nullpointerexception xsom

我有一个像这样的 XSD

<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>

当我使用 XSOM 解析此 XSD 时,它给出 Null Pointer Exception 。当我删除<xs:include schemaLocation="class.xsd"/>时元素工作正常

 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)

提前致谢

最佳答案

为什么会出现NullPointerException 问题是没有错误处理程序来处理解析时抛出的异常,因此解析中的异常会导致返回 null。

将 org.xml.sax.ErrorHandler 的实现实例设置为 errorHandler 可以解决该问题。

parser.setErrorHandler(new DOMErrorHandler());

DOMErrorHandler 是 org.xml.sax.ErrorHandler 的实现。

为什么 xs:include 不起作用

解析器解析指定XSDInputStream。因此,它不会获取给定架构的 systemId(),必须使用该架构创建 baseURI 来访问包含的文件。因此它将无法访问要包含的文件。

因此,当我使用架构的 InputSource 调用 parser.parse() 时,它工作正常。

关于java - 使用xsom处理XSD时出现空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14109393/

相关文章:

java - 如何在 Java 应用程序中播放音频

java - 如何使用 Maven 自动下载程序所需的依赖项?

java - 使用 ffmpeg 生成视频以使用 JavaFX 播放

c# - 是否可以将 schematron 架构编译成 Biztalk 程序集

java - 支持多个 xsd 版本

Java 2D 列表在第 6 个实体之后不会打印

xml - 在 Cocoa 中使用 xsd 文件验证 XML 模式?

java - 将 MySQL 驱动程序库添加到 NetBeans 项目

java - If 语句中的空指针异常

java - 什么是 NullPointerException,我该如何解决?