加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用XSD验证XML

发布时间:2020-12-16 07:59:25 所属栏目:百科 来源:网络整理
导读:我遇到了使用 XSD验证XML的真正困难.我应该在所有这些前面加上前缀,我是XSD和验证的新手,所以我不确定它是代码问题还是XML问题.我已经使用了大量不同的选项来回到XML API,并认为我已经找到了使用XSD验证XML的理想策略.注意,我的XML和XSD来自数据库,因此我不
我遇到了使用 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>的元素可能不是一个好主意 – 因为指令<?xml ......?>是一个预定义的指令,不应在文档的其他位置显示为标记名称.

渣子

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读