针对 XSD 验证 XML [重复]

Posted

技术标签:

【中文标题】针对 XSD 验证 XML [重复]【英文标题】:Validating XML against XSD [duplicate] 【发布时间】:2011-10-12 12:51:01 【问题描述】:

我需要使用给定的 XSD 文件验证 XML 文件。如果验证正常,我只需要该方法返回 true,否则返回 false。

【问题讨论】:

【参考方案1】:

简单地返回真或假(你也不需要任何外部库):

static boolean validateAgainstXSD(InputStream xml, InputStream xsd)

    try
    
        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;
    
    catch(Exception ex)
    
        return false;
    

【讨论】:

不应该执行用于执行情况而用于控制流吗?如果执行“测试”,我不会认为它是卓越的。它可以通过,也可以失败。必须考虑两种选择。也看看***.com/questions/15732/… 当要验证的文件包含 DOCTYPE 声明时,此代码不起作用,如果有人知道原因? 如果有人收到错误“No SchemaFactory tha implements [...]”,可能是因为你犯了和我一样的错误,它使用了常量 XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI。用上面提到的常量替换它。 在 Schema schema = factory.newSchema(new StreamSource(xsd));发送 xsd 进行验证时,加载 xsd 架构非常慢,有人知道为什么会发生这种情况吗?【参考方案2】:

XMLUnit 有一些不错的类可以做到这一点,他们的 README 文件中有一个示例:

Validator v = Validator.forLanguage(Languages.W3C_XML_SCHEMA_NS_URI);
v.setSchemaSources(Input.fromFile("local.xsd").build());
ValidationResult result = v.validateInstance(new StreamSource(new File("local.xml")));
return result.isValid();

【讨论】:

【参考方案3】:
public boolean validate() 
  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

  factory.setValidating(true);

  factory.setAttribute(
        "http://java.sun.com/xml/jaxp/properties/schemaLanguage",
        "http://www.w3.org/2001/XMLSchema");
  factory.setAttribute(
        "http://java.sun.com/xml/jaxp/properties/schemaSource",
        "http://domain.com/mynamespace/mySchema.xsd");
  Document doc = null;
  try 
    DocumentBuilder parser = factory.newDocumentBuilder();
    doc = parser.parse("data.xml");
    return true;
   catch (Exception e) 
    return false;
  

【讨论】:

【参考方案4】:

这可能取决于您使用的库,但谷歌搜索“如何在 java 中验证 xml 文件”给了我这些结果,您可能会在其中找到答案:

first interesting result

second interesting result

【讨论】:

感谢您提供的信息。帮助了我。

以上是关于针对 XSD 验证 XML [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中针对 xsd 的 XML 验证

通过单一方法针对 XSD 验证 XML

针对包含 xsd:import without location 的 XSD 验证 XML

针对同一 XML 模式 (XSD) 加快一批 XML 文件的 XML 模式验证

要针对多个 xsd 模式验证 XML

使用 php 针对 xsd 验证 xml 文件