c# - 使用 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 中工作?
解决方案
推荐阅读
- google-apps-script - 如何在谷歌应用脚本中通过 url 从图像中获取 EXIF?
- java - 忽略整个项目中的所有测试用例
- r - 使用连接中的字符向量通过引用分配多列
- javascript - Javascript如何使用已经提供的时间(以秒为单位)继续计时器
- image - Flutter Image Widget:如何将 Image 小部件转换为 Byte 数组
- c++ - 是否可以在没有头文件的情况下链接 dylib?
- r - 基于多个字符串的部分匹配的 R 数据框中的子集行
- c# - 在 MS 单元测试 (.NET Core) 中设置 System.Diagnostics.Activity.Current
- .net - .NET Core 2.2 Angular6 - 路由模板中的参数不完整
- ajax - AJAX 请求后光标插入符号总是改变