首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用XSD2CODE生成的C#类

如何使用XSD2CODE生成的C#类
EN

Stack Overflow用户
提问于 2011-06-23 16:50:09
回答 2查看 4.5K关注 0票数 1

我是XSD世界的新手,我使用过XML,但编程方面的知识不多。我已经成功地使用XSD2Code.Can生成了C#类,请有人指导我如何使用这些生成的类,并使用我的XSD2Code.Can来进行验证。

代码片段将受到高度赞赏。

谢谢并致以问候。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-23 16:58:37

验证XML不需要生成类。让我们看看这个帮助器类:

代码语言:javascript
复制
public class Validator
    {
        XmlSchemaSet schemaset;
        ILog logger;
        static Validator instance;
        static object lockObject = new Object();

        public static Validator Instance
        {
            get { return instance; }
        }

        public Validator(string schemaPath)
        {
            WarningAsErrors = true;
            logger = LogManager.GetLogger(GetType().Name);
            schemaset = new XmlSchemaSet();
            foreach (string s in Directory.GetFiles(schemaPath, "*.xsd"))
            {
                schemaset.Add(XmlSchema.Read(XmlReader.Create(s),new ValidationEventHandler((ss,e)=>OnValidateReadSchema(ss,e))));
            }
            instance = this;
        }

        private void OnValidateReadSchema(object ss, ValidationEventArgs e)
        {
            if (e.Severity == XmlSeverityType.Error)
                logger.Error(e.Message);
            else
                logger.Warn(e.Message);
        }
        public bool WarningAsErrors { get; set; }
        private string FormatLineInfo(XmlSchemaException xmlSchemaException)
        {
            return string.Format(" Line:{0} Position:{1}", xmlSchemaException.LineNumber, xmlSchemaException.LinePosition);
        }
        protected void OnValidate(object _, ValidationEventArgs vae)
        {
            if (vae.Severity == XmlSeverityType.Error)
                logger.Error(vae.Message);
            else
                logger.Warn(vae.Message);
            if (vae.Severity == XmlSeverityType.Error || WarningAsErrors)
                errors.AppendLine(vae.Message + FormatLineInfo(vae.Exception));
            else
                warnings.AppendLine(vae.Message + FormatLineInfo(vae.Exception));
        }

        public string ErrorMessage { get; set; }
        public string WarningMessage { get; set; }
        StringBuilder errors, warnings;
        public void Validate(String doc)
        {
            lock (lockObject)
            {
                errors = new StringBuilder();
                warnings = new StringBuilder();

                XmlReaderSettings settings = new XmlReaderSettings();
                settings.CloseInput = true;
                settings.ValidationEventHandler += new ValidationEventHandler((o, e) => OnValidate(o, e));  // Your callback...
                settings.ValidationType = ValidationType.Schema;
                settings.Schemas.Add(schemaset);
                settings.ValidationFlags =
                  XmlSchemaValidationFlags.ReportValidationWarnings |
                  XmlSchemaValidationFlags.ProcessIdentityConstraints |
                  XmlSchemaValidationFlags.ProcessInlineSchema |
                  XmlSchemaValidationFlags.ProcessSchemaLocation;

                // Wrap document in an XmlNodeReader and run validation on top of that
                try
                {
                    using (XmlReader validatingReader = XmlReader.Create(new StringReader(doc), settings))
                    {
                        while (validatingReader.Read()) { /* just loop through document */ }
                    }
                }
                catch (XmlException e)
                {
                    errors.AppendLine(string.Format("Error at line:{0} Posizione:{1}", e.LineNumber, e.LinePosition));
                }
                ErrorMessage = errors.ToString();
                WarningMessage = warnings.ToString();
            }
        }

    }

为了使用它,只需创建一个Validator实例,传递您的xsd所在的路径。然后调用Validate(string)来传递XML文档内容。您将发现使用找到的错误/警告(如果有)设置了ErrorMessageWarningMessage属性。为了正常工作,XML文档必须声明适当的xmlns。请注意,我的类默认使用log4net作为记录器机制,所以除非您也使用log4net,否则它不会按原样编译。

票数 1
EN

Stack Overflow用户

发布于 2011-06-23 17:06:50

看一下生成的Xsd2Code的序列化和反序列化方法,它看起来不像是做了模式验证。我不经常使用Xsd2Code,所以我可能是错的。

但是您可以使用XML类来设置XmlReaderSettings将使用的模式。

代码语言:javascript
复制
// Load the Schema Into Memory. The Error handler is also presented here.
StringReader sr = new StringReader(File.ReadAllText("schemafile.xsd"));
XmlSchema sch = XmlSchema.Read(sr,SchemaErrorsHandler);

// Create the Reader settings.
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add(sch);

// Create an XmlReader specifying the settings.
StringReader xmlData = new StringReader(File.ReadAllText("xmlfile.xml"));
XmlReader xr = XmlReader.Create(xmlData,settings);

// Use the Native .NET Serializer (probably u cud substitute the Xsd2Code serializer here.
XmlSerializer xs = new XmlSerializer(typeof(SerializableClass));
var data = xs.Deserialize(xr);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6451519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档