我遇到了使用
XSD验证XML的真正困难.我应该在所有这些前面加上前缀,我是XSD和验证的新手,所以我不确定它是代码问题还是XML问题.我已经使用了大量不同的选项来回到XML API,并认为我已经找到了使用XSD验证XML的理想策略.注意,我的XML和XSD来自数据库,因此我不需要从磁盘读取任何内容.
我已将问题缩小为简单的样本Windows Forms应用程序.它有一个XSD文本框(txtXsd),一个XML文本框(txtXml),一个结果文本框(txtResult),以及一个启动验证的按钮(btnValidate).
我正在使用Microsoft的示例XSD文件,
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:bookstore-schema" elementFormDefault="qualified" targetNamespace="urn:bookstore-schema"> <xsd:element name="title" type="xsd:string" /> <xsd:element name="comment" type="xsd:string" /> <xsd:element name="author" type="authorName"/> <xsd:complexType name="authorName"> <xsd:sequence> <xsd:element name="first-name" type="xsd:string" /> <xsd:element name="last-name" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:schema>
我在我的应用程序中使用以下代码.
private void btnValidate_Click (object sender,EventArgs e) { try { XmlTextReader reader = new XmlTextReader(txtXsd.Text,XmlNodeType.Document,new XmlParserContext(null,null,String.Empty,XmlSpace.None)); XmlSchema schema = XmlSchema.Read(reader,null); XmlSchemaSet schemas = new XmlSchemaSet(); schemas.Add(schema); XDocument doc = XDocument.Parse(txtXml.Text); doc.Validate(schemas,ValidateSchema); } catch (Exception exception) { txtResult.Text += exception.Message + Environment.NewLine; } } private void ValidateSchema (Object sender,ValidationEventArgs e) { txtResult.Text += e.Message + Environment.NewLine; }
作为测试,我输入了有效的XML,但我认为不应该符合上面的XSD.
<xml> <bogusNode>blah</bogusNode> </xml>
好吧,对于一个 – 您的XSD定义了一个XML命名空间xmlns =“urn:bookstore-schema”,它不存在于您的XML测试文件中 – 因此,您的XML测试文件中的任何内容都不会被验证.
如果从架构中删除这些元素:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="title" type="xsd:string" />
还使用名为< xml>的元素可能不是一个好主意 – 因为指令<?xml ......?>是一个预定义的指令,不应在文档的其他位置显示为标记名称.
渣子
原文地址:https://www.jb51.cc/xml/293138.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。