提问人:BATMAN_2008 提问时间:12/13/2022 最后编辑:BATMAN_2008 更新时间:12/13/2022 访问量:258
针对 XSD 的 Java XML 验证在第一次错误时失败,即使使用自定义错误处理程序也无法验证完整的 XML
Java XML validation against XSD fails at first error does not validate complete XML even with custom error handler
问:
有没有办法完全针对我的 XSD 验证我的 XML,这意味着我希望文件即使在发现错误后也能继续验证,以便我可以获得完整的错误消息,而不仅仅是 1 条或第一条错误消息?
目前,执行在发现第一个错误并打印它时停止,并且不再继续。我想知道是否有可能实现这一目标。我尝试了这里提到的方法并做了同样的事情,但它仍然没有按预期工作并且执行停止。
以下是我拥有的代码:XsdErrorHandler.class
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXParseException;
public class XsdErrorHandler implements ErrorHandler {
@lombok.Getter
private java.util.List<SAXParseException> exceptions;
public XsdErrorHandler() {
this.exceptions = new java.util.ArrayList<>();
}
@Override
public void warning(final SAXParseException exception) throws org.xml.sax.SAXException {
handleError(exception);
}
@Override
public void error(final SAXParseException exception) throws org.xml.sax.SAXException {
handleError(exception);
}
@Override
public void fatalError(final SAXParseException exception) throws org.xml.sax.SAXException {
handleError(exception);
}
public void handleError(SAXParseException e) throws org.xml.sax.SAXException {
// Do nothing. This will allow the validation to continue even if there are errors.
this.exceptions.add(e);
}
}
以下是我的架构验证器:Main.class
import javax.xml.XMLConstants;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestMain {
public static void main(String[] args) throws SAXException, IOException {
final String xsdPath = "/xsd/myXSD.xsd";
final String xmlPath = "/myXml.xml";
listParsingExceptions(xsdPath, xmlPath);
}
private static Validator initValidator(final String xsdPath) throws SAXException {
final SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
final Source schemaFile = new StreamSource(TestMain.class.getResourceAsStream(xsdPath));
final Schema schema = factory.newSchema(schemaFile);
return schema.newValidator();
}
public static List<SAXParseException> listParsingExceptions(final String xsdPath, final String xmlPath) throws IOException, SAXException {
final InputStream inputStream = TestMain.class.getResourceAsStream(xmlPath);
final XsdErrorHandler xsdErrorHandler = new XsdErrorHandler();
final Validator validator = initValidator(xsdPath);
validator.setErrorHandler(xsdErrorHandler);
try {
validator.validate(new StreamSource(inputStream));
} catch (SAXParseException e)
{
// ...
}
System.out.println("ERRORS : ");
xsdErrorHandler.getExceptions().forEach(e -> System.out.println(e.getMessage()));
return xsdErrorHandler.getExceptions();
}
}
问题:
我对我还需要做些什么才能让它继续工作有点困惑。有人可以提供一些建议吗?
此外,我的 XSD 包含许多对其他 XSD 的导入和引用。当我给出一个相对路径时,它不会起作用,但是当我给出一个绝对路径时,它就会起作用。有没有办法让它与相对路径一起工作?
以下失败:
<xsd:import namespace="urn:global:xsd:1" schemaLocation="./global.xsd"/>
以下作品:
<xsd:import namespace="urn:global:xsd:1" schemaLocation="/Users/username/project/validation/src/main/resources/xsd/global.xsd"/>
我试图使用这样的东西提供XSD文件的路径,但这对我也不起作用maven-jaxb2-plugin
<build>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.14.0</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<schemaDirectory>${basedir}/src/main/resources/xsd</schemaDirectory>
</configuration>
</plugin>
</plugins>
</build>
我试图通过引用这里来编写我自己的,并添加到我的使用中,但这对我也没有用。ClasspathResourceResolver
schemaFactory
schemaFactory.setResourceResolver(new ClasspathResourceResolver());
我的所有文件都存在于 XSD 文件夹中,我想使用类似这样的相对路径进行引用./xsdName.xsd
答: 暂无答案
评论
<xsd:import namespace="urn:global:xsd:1" schemaLocation="global.xsd"/>
schemaFactory.setResourceResolver()
maven-jaxb2-plugin
Moxy