2016-01-26 92 views
0

我想根据外部XSD描述验证XML文件。下面是我的XSD创建XML验证不验证功能

 private static Schema xmlSchema; 
     try { 
      SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
      String FEATURE= ""; 
      // forbid DOCTYPE 
      FEATURE = "http://apache.org/xml/features/disallow-doctype-decl"; 
      factory.setFeature(FEATURE, true); 
      xmlSchema = factory.newSchema(new File(XML_XSD_SCHEME)); 
     } catch (Exception e) { 

     } 

另外,Schema obejct,我创建validateXMLSchema静态方法,它负责验证XML文件:

public static boolean validateXMLSchema(String xmlPath) { 

    if (xmlSchema == null) { 
     return false; 
    } 

    InputStream inputStream = null; 
    try { 
     URL xmlFileURL = new File(xmlPath).toURI().toURL(); 

     inputStream = xmlFileURL.openStream(); 
     SAXSource saxSource = new SAXSource(new InputSource(inputStream)); 

     Validator validator = xmlSchema.newValidator(); 

     String FEATURE =""; 

     // disallow DOCTYPE 
     FEATURE = "http://apache.org/xml/features/disallow-doctype-decl"; 
     validator.setFeature(FEATURE, true); 

     //forbid external Entity 
     FEATURE ="http://xml.org/sax/features/external-general-entities"; 
     validator.setFeature(FEATURE, false); 

     //forbid external parameters 
     FEATURE ="http://xml.org/sax/features/external-parameter-entities"; 

     validator.setFeature(FEATURE, false); 

     validator.validate(saxSource); 

    } catch (Exception e) { 
     return false; 
    } finally { 
     try { 
      inputStream.close(); 
     } catch (IOException e) { 
     } 
    } 
    return true; 
} 

的问题是,即使我在添加的外部实体定义我的XML文件<!DOCTYPE foo [<!ELEMENT foo ANY ><!ENTITY......, validateXMLSchema方法返回true。 任何人都可以帮助我吗?

回答

1

我猜你希望这些功能适用于读取XML文档的SAX解析器。尝试创建一个新XMLReader和传递SAXSourceValidator之前明确将其配置:

SAXParserFactory spf = SAXParserFactory.newInstance(); 
spf.setNamespaceAware(true); 
XMLReader reader = spf.newSAXParser().getXMLReader(); 

String FEATURE =""; 

// disallow DOCTYPE 
FEATURE = "http://apache.org/xml/features/disallow-doctype-decl"; 
reader.setFeature(FEATURE, true); 

//forbid external Entity 
FEATURE ="http://xml.org/sax/features/external-general-entities"; 
reader.setFeature(FEATURE, false); 

//forbid external parameters 
FEATURE ="http://xml.org/sax/features/external-parameter-entities"; 
reader.setFeature(FEATURE, false); 

SAXSource saxSource = new SAXSource(reader, new InputSource(inputStream)); 

Validator validator = xmlSchema.newValidator(); 

validator.validate(saxSource); 
+0

谢谢。这是使用外部XSD验证设置功能的正确方法。我仍然有一些困难,但我确信这是由于我的实现和JAVA版本。多谢 – ikken