针对XSD文件验证XML文件的最佳方法是什么?
我正在生成一些需要符合给我的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
这是真正为我工作的事,几乎没有大惊小怪。