Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XML验证不会释放XML文件_Java_Xml_Validation - Fatal编程技术网

Java XML验证不会释放XML文件

Java XML验证不会释放XML文件,java,xml,validation,Java,Xml,Validation,我试图用JAVA中的XSD文件验证XML文件。我的问题不是验证本身,因为它工作正常。 我的问题是,XML文件在验证之后没有发布。如果之后我试图访问该文件,则会出现错误“该文件被其他资源使用” 只有当验证失败时(validator.validate(xmlSource);)才会发生此错误 如果文件验证没有问题,则该文件将被发布,并且其他人可以访问该文件 有什么想法吗 public void validateXMLAgainstXSD(String xmlPath, String xsdPath)

我试图用JAVA中的XSD文件验证XML文件。我的问题不是验证本身,因为它工作正常。 我的问题是,XML文件在验证之后没有发布。如果之后我试图访问该文件,则会出现错误“该文件被其他资源使用”

只有当验证失败时(validator.validate(xmlSource);)才会发生此错误 如果文件验证没有问题,则该文件将被发布,并且其他人可以访问该文件

有什么想法吗

public void validateXMLAgainstXSD(String xmlPath, String xsdPath) throws ParserException, IOException
  {
    Source xmlSource = null;
    File schemaFile = null;
    SchemaFactory schemaFactory = null;
    Schema schema = null;
    Validator validator = null;
    try 
    {
      schemaFile = new File(xsdPath);
      xmlSource = new StreamSource(new File(xmlPath));
      schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
      schema = schemaFactory.newSchema(schemaFile);
      validator = schema.newValidator();
      validator.validate(xmlSource);
    }
    catch (SAXException e)
    {
      //_log.error("ParsingDataFile: XML file could not be validated against XSD file: XML File=<", xmlFile.getAbsolutePath(), "> XSD file=<", xsdFile.getAbsolutePath(), ">. Exception=<", e, ">");
      xmlSource = null;
      schemaFile = null;
      schemaFactory = null;
      schema = null;
      validator.reset();
      validator = null;      
      //throw new ParserException(-1, ParserException.ERROR_CODE_XML_NOT_VALID, e);
    }
  }
public void validateXMLAgainstXSD(字符串xmlPath,字符串xsdPath)抛出ParserException,IOException
{
Source xmlSource=null;
文件schemaFile=null;
SchemaFactory SchemaFactory=null;
Schema=null;
Validator Validator=null;
尝试
{
schemaFile=新文件(xsdPath);
xmlSource=newstreamsource(新文件(xmlPath));
schemaFactory=schemaFactory.newInstance(xmlstants.W3C\u XML\u SCHEMA\u NS\u URI);
schema=schemaFactory.newSchema(schemaFile);
validator=schema.newValidator();
validator.validate(xmlSource);
}
捕获(SAXE异常)
{
//_log.error(“ParsingDataFile:XML文件无法根据XSD文件:XML文件=XSD文件=.Exception=”)进行验证;
xmlSource=null;
schemaFile=null;
schemaFactory=null;
schema=null;
reset();
验证程序=null;
//抛出新的ParserException(-1,ParserException.ERROR\u CODE\u XML\u无效,e);
}
}

我的建议是使用带有inputstream的构造函数创建StreamSource

那样

 InputStream inputStream = new FileInputStream(new File(xmlPath));
    source = new StreamSource(inputStream);
然后在方法中使用finally语句

finally{
inputStream.close();
}

但请记住,在转到“最终阻止”或“捕获关闭未初始化或打开的inputStream引发的异常”之前,请确保初始化了流。

RMachnik是正确的,工作起来很有魅力

也可以使用
TryWithResources

try (InputStream inputStream = new FileInputStream(file)) {
    ...
    new StreamSource(inputStream);
    ...
}

您如何“尝试在之后访问该文件”?您总是必须关闭打开的资源,或者大部分时间都必须关闭。我没有看到您使用任何
finally
块。@LutzHorn我试图将文件从一个目录移动到另一个目录。但是Rafik991提供的解决方案解决了我的问题。@Omoro是的,如果我打开了任何东西,我将需要关闭它。问题是没有什么可关闭的。。但是Rafik991的解决方案解决了我的问题。当您使用“新文件”构造函数调用流时,处理器应该关闭它,但看起来好像它没有这样做。这一建议可能会提供一个解决办法。但是我会向StreamSource构造函数添加一个SystemId,以便知道文档的基本URI。