xml文件正确性验证类的示例代码分析

互联网 17-3-24
很多时候我们的应用程序或者web程序需要用到xml文件进行配置,而最终的程序是需要给客户使用的,所以xml或者也需要客户来写,而客户来写的话的,就不能保证xml文件绝对的正确,于是我写了这个类,主要功能就是验证xml书写文件是否符合定义的xsd规范.
package common.xml.validator;    import java.io.File;  import java.io.FileInputStream;  import java.io.IOException;  import java.io.InputStream;  import java.io.Reader;  import java.io.StringReader;  import java.net.URL;    import javax.xml.XMLConstants;  import javax.xml.transform.Source;  import javax.xml.transform.stream.StreamSource;  import javax.xml.validation.Schema;  import javax.xml.validation.SchemaFactory;  import javax.xml.validation.Validator;    import org.xml.sax.SAXException;    /** *//**  * @author suyuan  *  */  public class XmlSchemaValidator {      private boolean isValid = true;    private String xmlErr = "";      public boolean isValid() {      return isValid;    }      public String getXmlErr() {      return xmlErr;    }      public XmlSchemaValidator()    {    }          public boolean ValidXmlDoc(String xml,URL schema)    {      StringReader reader = new StringReader(xml);      return ValidXmlDoc(reader,schema);    }      public boolean ValidXmlDoc(Reader xml,URL schema)    {      try {        InputStream schemaStream = schema.openStream();        Source xmlSource = new StreamSource(xml);        Source schemaSource = new StreamSource(schemaStream);        return ValidXmlDoc(xmlSource,schemaSource);        } catch (IOException e) {        isValid = false;        xmlErr = e.getMessage();        return false;      }    }      public boolean ValidXmlDoc(String xml,File schema)    {      StringReader reader = new StringReader(xml);      return ValidXmlDoc(reader,schema);    }      public boolean ValidXmlDoc(Reader xml,File schema)    {      try {        FileInputStream schemaStream = new FileInputStream(schema);        Source xmlSource = new StreamSource(xml);        Source schemaSource = new StreamSource(schemaStream);        return ValidXmlDoc(xmlSource,schemaSource);        } catch (IOException e) {        isValid = false;        xmlErr = e.getMessage();        return false;      }    }      public boolean ValidXmlDoc(Source xml,Source schemaSource)    {      try {       SchemaFactory schemafactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);        if(xml==null||xml.equals(""))        {            return false;        }        Schema schema = schemafactory.newSchema(schemaSource);        Validator valid = schema.newValidator();        valid.validate(xml);        return true;        } catch (SAXException e) {        isValid = false;        xmlErr = e.getMessage();        return false;      }      catch (IOException e) {        isValid = false;        xmlErr = e.getMessage();        return false;      }      catch (Exception e) {        isValid = false;        xmlErr = e.getMessage();        return false;      }    }  }

类的使用方法如下:

package common.xml.validator;    import java.io.*;  import java.net.URL;    public class testXmlValidator {      /** *//**     * @param args     */    public static void main(String[] args) {      InputStream XmlStream = testXmlValidator.class.getResourceAsStream("test.xml");      Reader XmlReader = new InputStreamReader(XmlStream);      URL schema =testXmlValidator.class.getResource("valid.xsd");      XmlSchemaValidator xmlvalid = new XmlSchemaValidator();      System.out.println(xmlvalid.ValidXmlDoc(XmlReader, schema));      System.out.print(xmlvalid.getXmlErr());    }    }

xsd文件定义如下:

<xs:schema id="XSDSchemaTest"   xmlns:xs="http://www.w3.org/2001/XMLSchema"    elementFormDefault="qualified"   attributeFormDefault="unqualified"  >    <xs:simpleType name="FamilyMemberType">   <xs:restriction base="xs:string">    <xs:enumeration value="384" />    <xs:enumeration value="385" />    <xs:enumeration value="386" />    <xs:enumeration value="" />   </xs:restriction>  </xs:simpleType>      <xs:element name="Answer">     <xs:complexType>    <xs:sequence>     <xs:element name="ShortDesc" type="FamilyMemberType" />     <xs:element name="AnswerValue" type="xs:int" />     </xs:sequence>     </xs:complexType>     </xs:element>    </xs:schema>

被验证的xml 实例如下:

<?xml version="1.0" encoding="utf-8" ?>    <Answer>    <ShortDesc>385</ShortDesc>    <AnswerValue>1</AnswerValue>  </Answer>

这个是java版本的类,C# 的类文件如下(是一个老美写的,我的类是根据他的类翻译过来的):

using System;  using System.Xml;  using System.Xml.Schema;  using System.IO;    namespace ProtocolManager.WebApp  {    /**//// <summary>    /// This class validates an xml string or xml document against an xml schema.    /// It has public methods that return a boolean value depending on the validation    /// of the xml.    /// </summary>    public class XmlSchemaValidator    {      private bool isValidXml = true;      private string validationError = "";        /**//// <summary>      /// Empty Constructor.      /// </summary>      public XmlSchemaValidator()      {        }        /**//// <summary>      /// Public get/set access to the validation error.      /// </summary>      public String ValidationError      {        get        {          return "<ValidationError>" + this.validationError + "</ValidationError>";        }        set        {          this.validationError = value;        }      }        /**//// <summary>      /// Public get access to the isValidXml attribute.      /// </summary>      public bool IsValidXml      {        get        {          return this.isValidXml;        }      }        /**//// <summary>      /// This method is invoked when the XML does not match      /// the XML Schema.      /// </summary>      /// <param name="sender"></param>      /// <param name="args"></param>      private void ValidationCallBack(object sender, ValidationEventArgs args)      {        // The xml does not match the schema.        isValidXml = false;        this.ValidationError = args.Message;      }         /**//// <summary>      /// This method validates an xml string against an xml schema.      /// </summary>      /// <param name="xml">XML string</param>      /// <param name="schemaNamespace">XML Schema Namespace</param>      /// <param name="schemaUri">XML Schema Uri</param>      /// <returns>bool</returns>      public bool ValidXmlDoc(string xml, string schemaNamespace, string schemaUri)      {        try        {          // Is the xml string valid?          if(xml == null || xml.Length < 1)          {            return false;          }            StringReader srXml = new StringReader(xml);          return ValidXmlDoc(srXml, schemaNamespace, schemaUri);        }        catch(Exception ex)        {          this.ValidationError = ex.Message;          return false;        }      }        /**//// <summary>      /// This method validates an xml document against an xml schema.      /// </summary>      /// <param name="xml">XmlDocument</param>      /// <param name="schemaNamespace">XML Schema Namespace</param>      /// <param name="schemaUri">XML Schema Uri</param>      /// <returns>bool</returns>      public bool ValidXmlDoc(XmlDocument xml, string schemaNamespace, string schemaUri)      {        try        {          // Is the xml object valid?          if(xml == null)          {            return false;          }            // Create a new string writer.          StringWriter sw = new StringWriter();          // Set the string writer as the text writer to write to.          XmlTextWriter xw = new XmlTextWriter(sw);          // Write to the text writer.          xml.WriteTo(xw);          // Get          string strXml = sw.ToString();            StringReader srXml = new StringReader(strXml);            return ValidXmlDoc(srXml, schemaNamespace, schemaUri);        }        catch(Exception ex)        {          this.ValidationError = ex.Message;          return false;        }      }        /**//// <summary>      /// This method validates an xml string against an xml schema.      /// </summary>      /// <param name="xml">StringReader containing xml</param>      /// <param name="schemaNamespace">XML Schema Namespace</param>      /// <param name="schemaUri">XML Schema Uri</param>      /// <returns>bool</returns>      public bool ValidXmlDoc(StringReader xml, string schemaNamespace, string schemaUri)      {        // Continue?        if(xml == null || schemaNamespace == null || schemaUri == null)        {          return false;        }          isValidXml = true;        XmlValidatingReader vr;        XmlTextReader tr;        XmlSchemaCollection schemaCol = new XmlSchemaCollection();        schemaCol.Add(schemaNamespace, schemaUri);          try        {          // Read the xml.          tr = new XmlTextReader(xml);          // Create the validator.          vr = new XmlValidatingReader(tr);          // Set the validation tyep.          vr.ValidationType = ValidationType.Auto;          // Add the schema.          if(schemaCol != null)          {            vr.Schemas.Add(schemaCol);          }          // Set the validation event handler.          vr.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);          // Read the xml schema.          while(vr.Read())          {          }            vr.Close();            return isValidXml;        }        catch(Exception ex)        {          this.ValidationError = ex.Message;          return false;        }        finally        {          // Clean up          vr = null;          tr = null;        }      }    }  }

希望 以上类对大家有所帮助,当然我也是在这里做一个标记,以后有需要可以直接用了 呵呵

以上就是xml文件正确性验证类的示例代码分析的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:XmlDocument XML编码转换的示例代码分享

相关资讯