针对XSD文件验证XML文件的最佳方法是什么?

时间:2020-03-05 18:40:38  来源:igfitidea点击:

我正在生成一些需要符合给我的xsd文件的xml文件。验证其符合性的最佳方法是什么?

解决方案

回答

这是使用Xerces2的方法。为此的教程,在这里(要求注册)。

原始出处:从此处公然复制:

import org.apache.xerces.parsers.DOMParser;
import java.io.File;
import org.w3c.dom.Document;

public class SchemaTest {
  public static void main (String args[]) {
      File docFile = new File("memory.xml");
      try {
        DOMParser parser = new DOMParser();
        parser.setFeature("http://xml.org/sax/features/validation", true);
        parser.setProperty(
             "http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation", 
             "memory.xsd");
        ErrorChecker errors = new ErrorChecker();
        parser.setErrorHandler(errors);
        parser.parse("memory.xml");
     } catch (Exception e) {
        System.out.print("Problem parsing the file.");
     }
  }
}

回答

我们在寻找工具还是库?

就库而言,事实上的标准是Xerces2,它同时具有C ++和Java版本。

不过要事先警告,这是一个沉重的解决方案。但是话又说回来,针对XSD文件验证XML是一个相当沉重的问题。

至于为我们执行此操作的工具,XMLFox似乎是一个不错的免费软件解决方案,但我不能肯定地说自己没有亲自使用过它。

回答

Java运行时库支持验证。上次我检查的是幕后的Apache Xerces解析器。我们可能应该使用javax.xml.validation.Validator。

import javax.xml.XMLConstants;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;
import java.net.URL;
import org.xml.sax.SAXException;
//import java.io.File; // if you use File
import java.io.IOException;
...
URL schemaFile = new URL("http://host:port/filename.xsd");
// webapp example xsd: 
// URL schemaFile = new URL("http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd");
// local file example:
// File schemaFile = new File("/location/to/localfile.xsd"); // etc.
Source xmlFile = new StreamSource(new File("web.xml"));
SchemaFactory schemaFactory = SchemaFactory
    .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
try {
  Schema schema = schemaFactory.newSchema(schemaFile);
  Validator validator = schema.newValidator();
  validator.validate(xmlFile);
  System.out.println(xmlFile.getSystemId() + " is valid");
} catch (SAXException e) {
  System.out.println(xmlFile.getSystemId() + " is NOT valid reason:" + e);
} catch (IOException e) {}

模式工厂常量是定义XSD的字符串" http://www.w3.org/2001/XMLSchema"。上面的代码针对URLhttp:// java.sun.com / xml / ns / j2ee / web-app_2_4.xsd验证了WAR部署描述符,但是我们可以轻松地针对本地文件进行验证。

我们不应使用DOMParser来验证文档(除非目标仍然是创建文档对象模型)。这将开始创建DOM对象,因为如果我们不打算使用它们,解析文档将很浪费。

回答

我只需要针对XSD验证XML,所以尝试了XMLFox。我发现它非常令人困惑和奇怪。帮助说明似乎与界面不匹配。

我最终使用了LiquidXML Studio 2008(v6),它更易于使用并且更加直接(UI与我经常使用的Visual Basic 2008 Express非常相似)。缺点:验证功能不是免费版本,因此我不得不使用30天试用版。

回答

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

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

Castor和JAXB是其他Java库,其目的类似于XMLBeans。

回答

另一个答案:由于我们说需要验证正在生成(写入)的文件,因此我们可能想在写入时验证内容,而不是先写入然后再读回进行验证。如果使用基于SAX的writer,则可以使用JDK API进行Xml验证,如果这样做,则可以通过调用" Validator.validate(source,result)"链接验证器,其中source来自writer,结果是需要输出的地方。

另外,如果我们使用Stax编写内容(或者使用或者可以使用stax的库),则在使用XMLStreamWriter时,Woodstox也可以直接支持验证。这是一个博客文章,显示了如何完成此操作:

回答

我发现该站点也有帮助。

http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi.html

这是真正为我工作的事,几乎没有大惊小怪。