我正在做一个项目,我们想根据 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);
}
我找不到根据 xsd 文件验证 XmlDocument 的方法。如果您有任何帮助以更好的方式完成相同的任务,我们将不胜感激。
谢谢!
最佳答案
尽管 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;
}
});
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>
您可以通过使您的 xml 无效来测试验证,例如删除元素 <orderperson>
.
显然,您不需要加载 XmlDocument,因为您已经拥有它并且必须调整架构路径。
关于c# - 在 C# 中根据 XSD 模式验证 json 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23895352/