在C#中针对XSD架构验证json数据

OBL*_*OBL 2 c# xml validation json

我正在开发一个项目,我们想要根据xsd模式验证数据,棘手的部分是数据可以来自json,xml等形式的相同来源.我已经想出如何让它对xml进行验证.我无法为JSON做同样的事情.我试图避免同时拥有json架构和xml架构.为此,我将我的json文件转换为像这样的XmlDocument;

using (var r = new StreamReader(xmlFileSource))
{
    var json = r.ReadToEnd();

    var xd = (XmlDocument)JsonConvert.DeserializeXmlNode(
        json.ToString(CultureInfo.InvariantCulture), fileName);
}
Run Code Online (Sandbox Code Playgroud)

我找不到一种方法来对xsd文件验证XmlDocument.任何帮助将不胜感激,或者如果您有任何建议以更好的方式完成相同的任务.

谢谢!

Edi*_*din 5

虽然Mark速度更快,但我会发布这个,因为它有点不同 - 它不需要再次将XmlDocument加载到流中,它有一个完整的工作示例:

        XmlDocument xml = new XmlDocument();
        xml.LoadXml(@"<?xml version=""1.0"" encoding=""UTF-8""?>
            <shiporder orderid=""889923"">
                <orderperson>John Smith</orderperson>
                <shipto>
                    <name>Ola Nordmann</name>
                    <address>Langgt 23</address>
                    <city>4000 Stavanger</city>
                    <country>Norway</country>
                </shipto>
            </shiporder>");

        xml.Schemas.Add(null, "schema.xsd");
        xml.Validate((sender, args) =>
        {
            switch (args.Severity)
            {
                case XmlSeverityType.Error:
                    Console.WriteLine("XML is invalid: {0}", args.Exception);
                    break;
                case XmlSeverityType.Warning:
                    // handle warning
                    ;
                    break;
            }
        });
Run Code Online (Sandbox Code Playgroud)

schema.xsd 具有以下内容:

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="shiporder">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="orderperson" type="xs:string"/>
                <xs:element name="shipto">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="name" type="xs:string"/>
                            <xs:element name="address" type="xs:string"/>
                            <xs:element name="city" type="xs:string"/>
                            <xs:element name="country" type="xs:string"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="orderid" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)

您可以通过使xml无效来测试验证,例如删除元素<orderperson>.

显然,您不需要加载XmlDocument,因为您已经拥有它并且必须调整模式的路径.