c# - 针对 XSD 的 C# XML 验证如何工作?
问题描述
我创建了一个库来使用XmlReaderSettings验证 XML 文件和 XSD 文件。它工作正常,直到用户在 XSD 文件中填充数据,然后将 XSD 扩展名更改为 XML并使用库来验证它们,并且该文件通过了验证。(虽然这不是创建 XML 文件的正确方法,但他们已经这样做了!)
所以我想知道 XmlReaderSettings 是如何工作的?以及如何检查 XML 文件不是 XSD 文件?
这是我的代码:
public static class XmlValidator
{
/// <summary>
/// Basic Validation of DA application.
/// Validate xml file with xsd file.
/// : return list of errors from validation, return empty list if no error occur.
/// </summary>
/// <param name="pathXml">Xml file path.</param>
/// <param name="pathXsd">Xsd file path.</param>
/// <returns>Return list of errors from validation, return empty list if no error occur.</returns>
public static List<string> Validate(string pathXml, string pathXsd, Action<DAStatus> callBack = null)
{
if (string.IsNullOrWhiteSpace(pathXml) || string.IsNullOrWhiteSpace(pathXsd))
{
throw new ArgumentException("Null or Empty are detected.");
}
else if (Path.GetExtension(pathXml).ToLower() != ".xml")
{
throw new InvalidFileTypeException(pathXml, ".xml");
}
else if (Path.GetExtension(pathXsd).ToLower() != ".xsd")
{
throw new InvalidFileTypeException(pathXsd, ".xsd");
}
List<string> errorList = new List<string>();
using (var fileStream = File.OpenRead(pathXml))
{
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add(null, pathXsd);
settings.ValidationType = ValidationType.Schema;
settings.ValidationEventHandler += (sender, e) => XMLReaderValidateHandler(e, errorList);
XmlReader xml = XmlReader.Create(fileStream, settings);
long lastPosition = 0;
long[] percent = { 0, 0 };
DAStatus progress = new DAStatus();
while (xml.Read())
{
// read and validate xml by xsd.
// Add callBack
if (callBack != null)
{
lastPosition = fileStream.Position;
percent[1] = Math.Min(100, (100 * lastPosition / fileStream.Length));
if (percent[0] < percent[1])
{
percent[0] = percent[1];
progress.ProgressPercent = percent[0];
callBack(progress);
}
}
}
}
return errorList;
}
private static void XMLReaderValidateHandler(ValidationEventArgs e, List<string> errorList)
{
errorList.Add(e.Message);
}
}
更新:我不认为我的问题与你们提到的问题重复,因为据我了解,该问题是关于自动使用特定位置的 XSD 文件来验证 XML,但我的问题更像是用户错误从以错误的方式创建 XML 文件。(通常他们应该以正确的方式创建 XML 文件,但他们希望我验证 XSD-XML 文件。)
用户已经向我发送了通过更改 XSD 文件创建的 XML 文件示例,因此我可以提供示例。
通常 XSD 元素如下所示:
<xs:element name="address" type="M_Address" />
他们像这样更改元素(还将文件扩展名更改为 .xml):
<xs:element name="test district" type="M_Address" />
解决方案
推荐阅读
- c# - Newtonsoft.json 或 System.Text.Json 仅序列化属性的定义类型而不是继承值
- flutter - 使用 Flutter 通知插件获取构建错误
- java - 如果在 Android Studio 中选中复选框,如何使字段成为必填项?
- r - 在自己的 R 包中使用 R 包“survival”中的“predict.coxph”
- python - 使用python仅拆分和解析字符串中的特定字符
- html - 网站加载时的 CSS 动画问题
- reactjs - 使用 Material IU Grid 在我的 React 应用程序中遇到 InfiniteScroll 问题
- firebase - 将数据添加到 Firestore 后获取 DocumentID - Flutter、Firebase
- windows - Powershell:导入 CSV,然后将其导出
- python - 装订阿拉伯字母