当前位置: 首页 > 知识库问答 >
问题:

Java Servlet:针对xsd的xml验证

滑畅
2023-03-14

我有一个servlet,它使用打包在.jar存档中的实用程序:

@Override
public void init() throws ServletException {
    ...
    try (InputStream stream = getClass().getResourceAsStream("/fileToParse.xml")) {
        App.check(stream);
    } catch (Exception e) {
        throw new ServletException(e);
    }
    ...
}

此实用工具获取xml文件流,针对xsd模式执行验证并解析它:

public class App {
    private static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
    private static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema"; 
    ...   
    public static void check(InputStream stream) {    
        SAXParserFactory spf = SAXParserFactory.newInstance();
        spf.setNamespaceAware(true);
        spf.setValidating(true);
        MyHandler handler = new MyHandler();
        try {
            SAXParser sp = spf.newSAXParser();
            sp.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
            XMLReader rdr = sp.getXMLReader();
            rdr.setContentHandler(handler);
            rdr.setErrorHandler(new MyErrorHandler());
            rdr.parse(new InputSource(stream));
        }
        ...
    }
    ...
}

xsd文件以:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.mydomain.org"
           elementFormDefault="qualified"
           xmlns:t="http://www.mydomain.org">
    <xs:element name="appContext">
        ...

xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<appContext xmlns="http://www.mydomain.org"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.mydomain.org appContext.xsd">
    ...
css/
js/
WEB-INF/
    classes/
        mypackage/
            MyServlet.class
        fileToParse.xml
    lib/
        App.jar
    web.xml
mypackage2/
    App.class
appContext.xsd

Servlet Init方法抛出异常:

...
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_21]
    at java.lang.Thread.run(Thread.java:722) [na:1.7.0_21]
Caused by: java.io.FileNotFoundException: /PATH_TO_TOMCAT/bin/appContext.xsd (No such file or directory)
    at java.io.FileInputStream.open(Native Method) ~[na:1.7.0_21]
    at java.io.FileInputStream.<init>(FileInputStream.java:138) ~[na:1.7.0_21]

如何指定SAXParser在哪里需要xsd模式来验证xml文件?

附注。对不起,我的英语不好

UPD:

我正在尝试添加此属性:

    private static final String JAXP_SCHEMA_SOURCE =
            "http://java.sun.com/xml/jaxp/properties/schemaSource";
    ....
    public static void check(InputStream stream) {
        ...
        try {
            ...
            sp.setProperty(JAXP_SCHEMA_SOURCE, new File(getPath("/appContext.xsd")));
            ...
        }
    }
    public static String getPath(String path) {
        return App.class.getResource(path).toString();
    }
ERROR mypackage2.App - Error: URI=null Line=5: schema_reference.4: Failed to read schema document 'jar:file:/PATH_TO_TOMCAT/webapps/myapp/WEB-INF/lib/App.jar!/appContext.xsd', 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>.
org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'jar:file:/PATH_TO_TOMCAT/webapps/myapp/WEB-INF/lib/App.jar!/appContext.xsd', 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>.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:198) ~[na:1.7.0_21]

UPD2:在xml文件中使用“classpath:appcontext.xsd”:

WARN  mypackage.App - Warning: URI=null Line=5: schema_reference.4: Failed to read schema document 'classpath:appContext.xsd', 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>.
org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'classpath:appContext.xsd', 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>.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:198) ~[na:1.7.0_21]
...
    at java.lang.Thread.run(Thread.java:722) [na:1.7.0_21]
Caused by: java.net.MalformedURLException: unknown protocol: classpath
    at java.net.URL.<init>(URL.java:592) ~[na:1.7.0_21
;;;

共有1个答案

濮阳唯
2023-03-14

尝试直接将架构源设置为inputstream

public static void check(InputStream stream) {
    ...
    try {
        ...
        sp.setProperty(JAXP_SCHEMA_SOURCE, getInputStream("/appContext.xsd")));
        ...
    }
}

public static InputStream getInputStream(String path) {
    return SAXLoader.class.getResourceAsStream(path);
}

检查从XML文件中删除XSD引用后设置此属性是否有效。如果不是,只需使用位于jar外部的XSD及其作为file引用传递的绝对路径进行测试,就可以检查该属性是否工作。

 类似资料:
  • 问题内容: 我需要使用给定的XSD文件验证XML文件。我只需要如果验证正常就返回true,否则返回false的方法。 问题答案: 仅返回true或false(也不需要任何外部库):

  • 问题内容: 但是,这将返回一条错误消息:线程“ main”中的异常java.lang.IllegalArgumentException:无法加载实现由http://www.w3.org/2001/XMLSchema -instance 指定的模式语言的SchemaFactory。 这是我的代码还是实际的xsd文件有问题? 问题答案: 该错误意味着您安装的Java没有任何可解析XMLSchema文件

  • 我是XSD新手,不知道为什么我的XSD没有进行验证。我收到以下错误: s4s-elt-无效-内容.1:“参数信息”的内容无效。元素“复杂类型”无效、放错位置或出现过于频繁。 cvc复合型。2.4。d: 发现以元素“exception”开头的无效内容。此时不需要任何子元素。 XML: XSD: 我错过了什么吗?我想通过使用复杂类型并引用它们来分解它,从而使其更容易...

  • 问题内容: 我有一个XML文件,并且有一个XML模式。我想针对该架构验证文件,并检查其是否符合该架构。我正在使用python,但是如果python中没有这样有用的库,则可以使用任何语言。 我在这里最好的选择是什么?我会担心如何快速启动和运行它。 问题答案: 绝对可以。 使用预定义的架构定义,加载文件并捕获任何XML架构错误: 关于编码的注意事项 如果模式文件包含带有编码(例如)的xml标记,则上面

  • 我试图根据内部引用另一个XSD的XSD验证XML(使用include语句)。 作为, 现在,当根据xsd(Schema1.xsd)验证我的XML时,如下所示: 我得到一个错误,“cvc-datatype-valid.1.2.1:'true'不是'boolean'的有效值。” 这是针对schema1.xsd引用的schema2.xsd中定义的元素。 如果我做错了什么,请告诉我。

  • 我的目标是读取CSV文件,将其转换为XML,并根据XSD对其进行验证。代码如下: 错误: 线程“main”组织中出现异常。阿帕奇。骆驼FailedToCreateRouteException:无法在以下位置创建路由1: 此外,我还想配置如果XML对给定的XSD无效,是否会发生异常。我们如何配置它? 请好心帮忙。