【问题标题】:Validating xml against xsd but getting org.xml.sax.SAXParseException针对 xsd 验证 xml 但得到 org.xml.sax.SAXParseException
【发布时间】:2022-02-03 20:56:05
【问题描述】:

我正在尝试根据 Java 中的 XSD 文件验证 XML。

这是我的代码:

public static InputStream inputStreamFromClasspath(String path) {
    return Utils.class.getClassLoader().getResourceAsStream(path);
}   

public static boolean validateXMLSchema() throws SAXException, IOException {

    InputStream xsd = inputStreamFromClasspath("/xml/students_xsd.xml");
    InputStream xml = inputStreamFromClasspath("/xml/students.xml");
    SchemaFactory factory =
                SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Schema schema = factory.newSchema(new StreamSource(xsd));
    Validator validator = schema.newValidator();
    validator.validate(new StreamSource(xml));
    return true;
}

但我收到一个错误:

org.xml.sax.SAXParseException; schema_reference.4: Failed to read schema document 'null', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.

代码参考:Validating XML against XSD

我的学生 xml 文件是:

<?xml version = "1.0"?>

<class>
    <student rollno = "393">
        <firstname>Dinkar</firstname>
        <lastname>Kad</lastname>
        <nickname>Dinkar</nickname>
        <marks>85</marks>
    </student>

    <student rollno = "493">
        <firstname>Vaneet</firstname>
        <lastname>Gupta</lastname>
        <nickname>Vinni</nickname>
        <marks>95</marks>
    </student>

    <student rollno = "593">
        <firstname>Jasvir</firstname>
        <lastname>Singh</lastname>
        <nickname>Jazz</nickname>
        <marks>90</marks>
    </student>
</class>

而xsd文件是:

<?xml version = "1.0"?>

<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">
    <xs:element name = 'class'>
        <xs:complexType>
            <xs:sequence>
                <xs:element name = 'student' type = 'StudentType' minOccurs = '0'
                            maxOccurs = 'unbounded' />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:complexType name = "StudentType">
        <xs:sequence>
            <xs:element name = "firstname" type = "xs:string"/>
            <xs:element name = "lastname" type = "xs:string"/>
            <xs:element name = "nickname" type = "xs:string"/>
            <xs:element name = "marks" type = "xs:positiveInteger"/>
        </xs:sequence>
        <xs:attribute name = 'rollno' type = 'xs:positiveInteger'/>
    </xs:complexType>
</xs:schema>

不知道我哪里错了,任何建议都会有所帮助。谢谢。

【问题讨论】:

    标签: java xml xsd xmlschema


    【解决方案1】:

    另一件事:

        InputStream xsd = inputStreamFromClasspath("/xml/students_xsd.xml");
        return Utils.class.getClassLoader().getResourceAsStream(path);
    
    • ClassLoader 使用不带/ 前面的绝对路径。
    • 一个类可能使用相对路径(相对于它的包),而对于绝对路径,需要在前面加上 /

    要么(我的偏好,模块化 java 更好)

        InputStream xsd = inputStreamFromClasspath("/xml/students_xsd.xml");
        return Utils.class.getResourceAsStream(path);
    

    或(需要更正所有调用)

        InputStream xsd = inputStreamFromClasspath("xml/students_xsd.xml");
        return Utils.class.getClassLoader().getResourceAsStream(path);
    

    由于该斜线,您获得了 null 资源。

    【讨论】:

    • 谢谢,问题出在架构中,它是 xs,应该是 xsd。但这也是一个问题。
    • @Rumi:嗯,你确定吗?您的 XSD 定义并使用带有 xmlns:xs = "http://www.w3.org/2001/XMLSchema"xs:schema 根元素,这很好,而不是将 xsd 定义为命名空间前缀。在我看来,由于 Joop 指出的一个或多个问题,您更可能在指定 XSD 时搞砸了。
    • 你说得对,我弄乱了文件路径,谢谢。
    • 使用 Class.getResource(AsStream) 比使用 ClassLoader 方法更好。在模块化应用程序中,它们的行为略有不同。见stackoverflow.com/questions/68314700/…
    猜你喜欢
    • 2018-05-30
    • 1970-01-01
    • 2012-09-20
    • 2011-10-12
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 2014-03-01
    相关资源
    最近更新 更多