JSON转XML并XSD验证时遇错误:XmlSchemaSet无法转XmlNode
问题解决:无法将XmlSchemaSet转换为XmlNode的编译错误
错误原因
你调用XmlDocument.Validate方法时传错了参数。该方法的第二个参数接受XmlNode类型,而你传入了XmlSchemaSet对象,导致类型不匹配的编译错误。
修复后的代码
修改ValidateJsonAgainstXsd方法,先将XmlSchemaSet关联到XmlDocument的Schemas集合,再调用仅接受验证事件处理器的Validate重载:
static void Main(string[] args) { string json = File.ReadAllText(@"C:\Test\json1.json"); string xsd = File.ReadAllText(@"C:\Test\xsd1.xsd"); bool isValid = ValidateJsonAgainstXsd(json, xsd); if (!isValid) { Console.WriteLine("JSON不符合XSD验证规则。"); return; } XmlDocument xmlDoc = JsonConvert.DeserializeXmlNode(json, "root"); xmlDoc.Save(@"C:\Test\my.xml"); } static bool ValidateJsonAgainstXsd(string json, string xsd) { XmlSchemaSet schemas = new XmlSchemaSet(); schemas.Add("", XmlReader.Create(new StringReader(xsd))); XmlDocument xmlDoc = new XmlDocument(); // 将Schema集合关联到XmlDocument xmlDoc.Schemas = schemas; xmlDoc.LoadXml(JsonConvert.DeserializeXmlNode(json).OuterXml); bool isValid = true; // 调用仅接受ValidationEventHandler的重载 xmlDoc.Validate((sender, e) => { Console.WriteLine(e.Message); isValid = false; }); return isValid; }
额外优化建议
可以避免重复反序列化JSON到XML,验证时生成的XmlDocument可直接复用,减少一次序列化操作:
static void Main(string[] args) { string json = File.ReadAllText(@"C:\Test\json1.json"); string xsd = File.ReadAllText(@"C:\Test\xsd1.xsd"); XmlDocument xmlDoc; bool isValid = ValidateJsonAgainstXsd(json, xsd, out xmlDoc); if (!isValid) { Console.WriteLine("JSON不符合XSD验证规则。"); return; } xmlDoc.Save(@"C:\Test\my.xml"); } static bool ValidateJsonAgainstXsd(string json, string xsd, out XmlDocument xmlDoc) { XmlSchemaSet schemas = new XmlSchemaSet(); schemas.Add("", XmlReader.Create(new StringReader(xsd))); xmlDoc = new XmlDocument(); xmlDoc.Schemas = schemas; xmlDoc.LoadXml(JsonConvert.DeserializeXmlNode(json).OuterXml); bool isValid = true; xmlDoc.Validate((sender, e) => { Console.WriteLine(e.Message); isValid = false; }); return isValid; }
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

