我正在生成一些xml文件,需要符合xsd文件给我。我该如何验证它们是否一致?


当前回答

如果你有一台Linux-Machine,你可以使用免费的命令行工具SAXCount。我发现这非常有用。

SAXCount -f -s -n my.xml

它针对dtd和xsd进行验证。 5s,一个50MB的文件。

在debian中,它位于包“libxerces-c-samples”中。

dtd和xsd的定义必须在xml中!你不能分别配置它们。

其他回答

我们使用ant构建我们的项目,所以我们可以使用schemvalidate任务来检查我们的配置文件:

<schemavalidate> 
    <fileset dir="${configdir}" includes="**/*.xml" />
</schemavalidate>

现在淘气的配置文件将失败我们的构建!

http://ant.apache.org/manual/Tasks/schemavalidate.html

还有一个答案:既然您说过需要验证正在生成(写入)的文件,那么您可能希望在写入时验证内容,而不是先写入,然后再读取以进行验证。如果你使用的是基于sax的writer,你也可以使用JDK API进行Xml验证:如果是这样,只需调用' validator '来链接验证器。Validate (source, result)',其中source来自你的作者,result是输出需要去的地方。

或者,如果使用Stax来编写内容(或者使用或可以使用Stax的库),Woodstox也可以在使用XMLStreamWriter时直接支持验证。下面是一篇博客文章,展示了如何做到这一点:

如果您正在以编程方式生成XML文件,那么您可能需要查看XMLBeans库。使用命令行工具,XMLBeans将自动生成并打包一组基于XSD的Java对象。然后可以使用这些对象基于此模式构建XML文档。

它内置了模式验证支持,可以将Java对象转换为XML文档,反之亦然。

Castor和JAXB是其他Java库,其功能与XMLBeans类似。

使用Woodstox,配置StAX解析器以根据您的模式进行验证并解析XML。

如果异常被捕获,则XML无效,否则有效:

// create the XSD schema from your schema file
XMLValidationSchemaFactory schemaFactory = XMLValidationSchemaFactory.newInstance(XMLValidationSchema.SCHEMA_ID_W3C_SCHEMA);
XMLValidationSchema validationSchema = schemaFactory.createSchema(schemaInputStream);

// create the XML reader for your XML file
WstxInputFactory inputFactory = new WstxInputFactory();
XMLStreamReader2 xmlReader = (XMLStreamReader2) inputFactory.createXMLStreamReader(xmlInputStream);

try {
    // configure the reader to validate against the schema
    xmlReader.validateAgainst(validationSchema);

    // parse the XML
    while (xmlReader.hasNext()) {
        xmlReader.next();
    }

    // no exceptions, the XML is valid

} catch (XMLStreamException e) {

    // exceptions, the XML is not valid

} finally {
    xmlReader.close();
}

注意:如果您需要验证多个文件,您应该尝试重用您的XMLInputFactory和XMLValidationSchema,以最大化性能。

使用Java 7,您可以遵循包描述中提供的文档。

// create a SchemaFactory capable of understanding WXS schemas SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); // load a WXS schema, represented by a Schema instance Source schemaFile = new StreamSource(new File("mySchema.xsd")); Schema schema = factory.newSchema(schemaFile); // create a Validator instance, which can be used to validate an instance document Validator validator = schema.newValidator(); // validate the DOM tree try { validator.validate(new StreamSource(new File("instance.xml")); } catch (SAXException e) { // instance document is invalid! }