针对 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
针对包含 xsd:import without location 的 XSD 验证 XML