首页 > 解决方案 > 使用 C# 中 XML 文档内部引用的 XSD 文件验证 XML 文件

问题描述

我正在尝试创建一个类来验证包含命名空间和 schemaLocation 的 XML 文件。我得到了以下代码来运行,并且很可能是应该的。

我的 XML 文档将有一个

<Root xmlns="http://www.irs.gov/efile" 
    xmlns:efile="http://www.irs.gov/efile" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.irs.gov/efile \\network\\path\\to\\file.xsd">

我正在使用以下代码对其进行验证:

public bool Validate(string xml){
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.ValidationType = ValidationType.Schema;            
    settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
    settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
    settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
    XmlReader reader = XmlReader.Create(new StringReader(_xml), settings);
    using(reader){
        while(reader.Read());
    }
}

private void ValidationCallback(object sender, ValidationEventArgs args){
//I add the args to a property
}

这可以很好地处理文件,但它并没有按照它需要的方式验证它。它应该引用 schemaLocation 中的 XSD 文件(我已确保这在其他工具中有效,它可以正确找到并验证文件)。

但是,对于 XML 文件中的每个节点,我都会收到此警告或类似警告:

Message = “找不到元素‘ http://www.irs.gov/efile:nodeName ’的架构信息。”

我还尝试在运行时更改 XML 文本以通过 URL 定位 XSD 文件(有一个不在网络上的 URL),但结果相同。

编辑

经过更多测试后,我真的认为它只是没有正确加载 XSD 文件。

然后,我尝试了几件事,这些事情不可避免地以略有不同但同样模糊的错误结束:

类型“ http://www.irs.gov/efile:StringType ”未声明,或者不是简单类型。

我认为它正在加载初始 xsd 文件,但里面有几个(我的意思是大约 600 个,仅计算第二级)其他引用,都在相同的文件结构中,而不是在服务器驱动器上。

然后我尝试使用这个实现:

public bool Validate(string xml){
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.ValidationType = ValidationType.Schema;            
    settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
    settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
    settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
    settings.XmlResolver = new XmlUrlResolver();

    XmlReader xsdReader = XmlReader.Create(@"\\network\path\to\file.xsd");
    using(xsdReader){
        settings.Schemas.Add(nameSpace, xsdReader); //namespace is grabbed earlier in the method, it is accurate to the XML file
    }
    settings.Schemas.Compile(); //The same error is thrown here

    XmlReader reader = XmlReader.Create(new StringReader(_xml), settings);
    using(reader){
        while(reader.Read());
    }
}

这会导致方法调用出现完全相同的错误

settings.Schemas.Compile();

我还尝试在 XmlUrlResolver 类中重载 GetEntity 和 ResolveUri 方法,并使用我给它的网络路径调用一次 ResolveUri 和 GetEntity 方法

\\network\path\to\file.xsd

编辑

我正在使用 .NET 核心。一个快速的发现告诉我,模式是在 Regular .Net 中读取和编译的(?不知道该怎么称呼它来区分)。

我怎样才能让它在 .NET Core 中工作?

标签: c#xmlxsd

解决方案


推荐阅读