You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 08:13:15