.Net XML 模式验证是否应该在到达第一个无效元素时停止?

2024-01-03

我加载了一个 XML 字符串和一个架构并将其传递到一个函数中。我让它根据模式正确验证 XML,但是它总是在第一个无效元素的范围内停止验证。无效数据,它会继续下去,无效/缺失属性,会继续下去,但无效元素,它会停止,并且不会在该范围内进一步验证。

架构如下:

<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="items">
          <xs:complexType>
            <xs:sequence maxOccurs="unbounded">
              <xs:element name="foo">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="bar" type="xs:integer" />
                    <xs:element name="bat" type="xs:integer" />
                  </xs:sequence>
                  <xs:attribute name="attr1" type="xs:integer" use="required" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

xml如下:

<root>
  <items>
    <foo attr1='1'>
      <invalid0>1</invalid0>
      <invalid1>b</invalid1>
    </foo>
    <foo attr1='1'>
      <invalid2>b</invalid2>
      <bat>b</bat>
    </foo>
    <foo attr1='1'>
      <bar>3</bar>
    </foo>
    <invalidFoo attr1='1'>
      <bar>d</bar>
      <bat>2</bat>
    </invalidFoo>
    <foo>
      <bar>3</bar>
      <bat>q</bat>
    </foo>
  </items>
</root>

那么,在这个例子中验证器到达第一个时会发生什么<foo>并看到<invalid0>并且不在范围内验证<foo>任何进一步,因此错过<invalid1>。验证者继续下一步<foo>.

下一个<foo>它看到有一个<invalid2>它不属于那里,并且不费心去捕获无效数据<bat>元素(字符串而不是整数)。就直接进入下一步了<foo>

它使它进入下一个<foo>元素并抛出有关缺失的错误<bat>并继续下一步<foo>, cool.

现在它到了<invalidFoo>理所当然,不会在内部进行任何验证<invalidFoo>因为,当然,什么是<invalidFoo>?

对我来说,症结在于,此时验证器停止验证以下所有内容<foo>兄弟元素,所以最后的无效数据<bat>没有被抓住。所以现在,我问的原因是因为我使用验证的方式是尝试捕获所有错误(或至少尽可能多)并将它们传递回用户。我在实际代码中所做的第一个测试相当于:

<root>
  <items>
    <invalidFoo attr1='1'>
      <invalid0>1</invalid0>
      <invalid1>b</invalid1>
    </invalidFoo>
    <foo attr1='1'>
      <invalid2>b</invalid2>
      <bat>b</bat>
    </foo>
    <foo attr1='1'>
      <bar>3</bar>
    </foo>
    <invalidFoo attr1='1'>
      <bar>d</bar>
      <bat>2</bat>
    </invalidFoo>
    <foo>
      <bar>3</bar>
      <bat>q</bat>
    </foo>
  </items>
</root>

所以,验证者首先看到了这一点<invalidFoo>然后死了。在很长一段时间里,我假设由于某种原因验证总是在出现第一个错误时停止。直到我添加了一个有效的<foo>回来它开始连续捕获并累积其他无效数据错误。但一旦遇到无效的元素标记名,所有同级/子级验证都会被跳过。它仅发生在无效元素上,而不发生在属性或数据上。

现在,我不是说这是对还是错……我是问这是对还是错?验证器是否应该继续运行,特别是在兄弟元素的情况下?或者它应该停止并基本上根据前一个元素的无效而将整个元素列表称为无效?在这种情况下,Xml 架构验证器的预期行为是什么?

这一切都是使用以下 C# 代码完成的(其工作原理符合我的预期):

 public static void ValidateAgainstSchema(string XMLSourceDocument, XmlSchemaSet validatingSchemas)
 {
    if (validatingSchemas == null)
    {
        throw new ArgumentNullException("In ValidateAgainstSchema: No schema loaded.");
    }

    string errorHolder = string.Empty;
    ValidationHandler handler = new ValidationHandler();

    XmlReaderSettings settings = new XmlReaderSettings();
    settings.CloseInput = true;
    settings.ValidationType = ValidationType.Schema;
    settings.ValidationEventHandler += new ValidationEventHandler(handler.HandleValidationError);
    settings.Schemas.Add(validatingSchemas);
    settings.ValidationFlags =
        XmlSchemaValidationFlags.ReportValidationWarnings |
        XmlSchemaValidationFlags.ProcessIdentityConstraints |
        XmlSchemaValidationFlags.ProcessInlineSchema |
        XmlSchemaValidationFlags.ProcessSchemaLocation;

    StringReader srStringReader = new StringReader(XMLSourceDocument);

    using (XmlReader validatingReader = XmlReader.Create(srStringReader, settings))
    {
        while (validatingReader.Read()) { }
    }

    if (handler.MyValidationErrors.Count > 0)
    {
        foreach (String messageItem in handler.MyValidationErrors)
        {
            errorHolder += messageItem;
        }
        throw new XmlSchemaValidationException(errorHolder);
    }
}

验证事件处理程序只是捕获错误并将它们添加到IList<string>以便稍后一起显示。


它通过遍历树来获取元素,因此一旦它得到不适合的节点,它就会丢失。 然而,属性不是分层的,它们是一个列表,所以它是直接进行/不进行,并且可以继续,类型检查也很简单。

你可以看看你的例子,并思考它可以解决这个问题,但这又怎么样。

<root>
  <items>
    <invalidFoo attr1='1'>
      <invalid0>1</invalid0>
      <invalid1>b</invalid1>
      <foo attr1='1'>
        <bar>b</bar>
        <bat>b</bat>
      </foo>    
    </invalidFoo>
  <items>
<root>

是否应该将 foo 视为 items 的子项。 foo 真的是 foo 吗?

如果你想要一个真正的弯头想象一下有一个xsd:choice其中有一个或两个,并且选择了不符合模式的有效节点。 这是其中一种情况,尝试继续是“危险的”,所以它提示并说你需要先解决这个问题,这样我才能明智地验证接下来会发生什么。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.Net XML 模式验证是否应该在到达第一个无效元素时停止? 的相关文章

  • 是什么原因导致 Linq 错误:此方法无法转换为存储表达式?

    我有一堆具有相同 select 语句的 Linq to Entity 方法 所以我想我会很聪明 并将其分离到它自己的方法中以减少冗余 但是当我尝试运行代码时 我得到了以下内容错误 该方法不能转化为 商店表达式 这是我创建的方法 public
  • 如何将 CSV 文件读入 .NET 数据表

    如何将 CSV 文件加载到System Data DataTable 根据CSV文件创建数据表 常规 ADO net 功能是否允许这样做 我一直在使用OleDb提供者 但是 如果您正在读取具有数值的行 但希望将它们视为文本 则会出现问题 但
  • 创建带有部分的选项卡式侧边栏 WPF

    我正在尝试创建一个带有部分的选项卡式侧边栏 如 WPF 中的以下内容 我考虑过几种方法 但是有没有更简单 更优雅的方法呢 方法一 列表框 Using a ListBox并将 SelectedItem 绑定到右侧内容控件所绑定的值 为了区分标
  • .NET 中严格浮点数学的库

    我有 Java 算法 计算及其单元测试 单元测试期望结果具有一定的精度 增量 现在我将算法移植到 NET 中 并希望使用相同的单元测试 我使用双数据类型 问题在于 Java 使用 strictfp 64 位 来执行 Math 类中的某些操作
  • 当用户打开文件时如何锁定对文件的访问?

    我正在编写一个 C NET 程序 该程序使用 XmlSerializer 对当前用户正在处理的项目与 XML 文件进行序列化和反序列化 这工作正常 但我试图找到一种方法来防止两个用户从网络驱动器打开同一个文件并让一个用户覆盖前一个用户的保存
  • 确定最接近的已知颜色

    我允许我的应用程序的用户选择自定义颜色 并希望有一种方法来显示每种颜色的友好名称 而不是显示十六进制代码的文本表示形式 我如何找到最近的System Drawing Color对于给定的十六进制代码 希望这对某人有帮助 Public Fun
  • 序列包含多个元素

    我在通过 Linq 获取 RhsTruck 类型的列表并显示它们时遇到一些问题 RhsTruck 只有属性 品牌 型号 序列号 等 RhsCustomer 具有 CustomerName CustomerAddress 等属性 我不断收到错
  • 如何获取可用系统内存的大小?

    C NET 中是否可以获取系统可用内存的大小 如果是的话怎么办 Use Microsoft VisualBasic Devices ComputerInfo TotalPhysicalMemory http msdn microsoft c
  • .NET 内存不足故障排除

    在阅读了几篇有关 NET 技术中的内存的启发性文章后 Out of Memory 不是指物理内存 https learn microsoft com en us archive blogs ericlippert out of memory
  • 为使用 SSH.NET SshClient.CreateShellStream 执行的命令 (sudo/su) 提供子命令

    我正在尝试使用 Renci SSH NET 从 C Web 应用程序连接到远程 Linux 服务器并执行 shell 脚本 我想一个接一个地运行脚本 但不知道如何运行脚本并读取输出并将其存储在标签中 我已经尝试了下面的代码 但无法一行接一行
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com
  • 如何将位写入文件?

    如何使用 c net 将位 而不是字节 写入文件 我很坚持它 Edit 我正在寻找一种不同的方法 将每 8 位写为一个字节 一次可以写入的最小数据量是一个字节 如果您需要写入单独的位值 例如 二进制格式需要 1 位标志 3 位整数和 4 位
  • .NET 中的跟踪中的“开关”和“过滤器”有什么区别?

    NET 中的跟踪中的 开关 和 过滤器 有什么区别 他们似乎以相似的方式工作
  • 任务和异步任务之间的区别

    C 提供了两种创建异步方法的方法 Task static Task
  • 为什么我的程序集在安装到 GAC 后在“添加引用 > .Net”中不可见?

    我想问一个关于 GAC 的简单问题我创建了一个程序集 Awesome DLL 对其进行签名 然后将其安装到 GAC 中 C MyApps Awesome Awesome Awesome bin Release gt sn k Awesome
  • 如何将 dll 中包含的组件嵌入到 exe 中,以便它可以从内存运行?

    我正在尝试制作一个必须从内存运行的程序 通过Assembly Load bin 如上所述here http www codeproject com Articles 13897 Load an EXE File and Run It fro
  • .Net 支持柯里化泛型吗?

    假设我们有一个嵌套的泛型类 public class A
  • ArrayList 有什么问题?

    最近我问了一个关于 SO 的问题 其中提到了可能使用 c ArrayList 来解决问题 有人评论说使用数组列表不好 我想了解更多有关此的信息 我以前从未听说过关于数组列表的这种说法 有人可以带我了解使用数组列表可能出现的性能问题吗 C n

随机推荐

  • Jetty嵌入和JSP编译到1.7?

    我可以以某种方式指定jsp编译的vm的目标版本吗 我需要 1 7 而不是默认的 1 5 我有一个Web应用程序上下文 代码中的一些过滤器等 webapp 本身就是一场爆炸性的战争 因此没有使用 xml 配置 因为不需要 但似乎 为了做到这一
  • 初始包含块和视口之间的区别

    两者之间有什么区别还是相同 我认为它们指的是同一件事 但在不同的上下文中 但我不确定 所以我在这里问 初始包含块和视口虽然彼此相关 但却是两个不同的概念 视口通常是指浏览器窗口的可视区域 页面在屏幕上呈现在该区域中 初始包含块是页面内的逻辑
  • Python 2.6 聊天循环问题。无法同时接收和发送

    我正在尝试制作一个控制台聊天程序 但我的循环有问题 我无法同时获得输入和接收其他人的输入 如果一端发送了两条或更多消息 则另一端在发送一条消息之前无法接收下一条消息 我对 python 相当陌生 正在寻找正确方向的推动 我考虑过多线程 但这
  • 如何使用非 root 用户创建 postgres 容器?

    我想以非 root 用户身份运行 postgres 容器 默认情况下 该映像具有用户 postgres uid 999 当通过命令访问容器时docker exec it mycontainer bin bash 用户是root 为了使容器更
  • 如何在使用 node_save($node) 创建节点时将图像附加到节点;

    您好 我正在使用 drupal 7 并尝试通过使用 php 解析 xml 来导入数据 然后使用以下命令创建节点node save node 到目前为止 我已经成功地从 xml 创建节点 无需任何图像 我想在导入图像时将图像附加到节点 我知道
  • 将值从页面传递到用户控件

    我将姓名和姓氏存储在主页的两个标签中 我在一个类中也有这些值 类没有做太多事情 但我将它们用于将来的扩展 我有一个用户控件 它将发送一封以姓名和姓氏作为正文的电子邮件 我的问题是如何将标签或类变量值传输到用户控件的主体变量中 使用要传递给它
  • 混合 16 位线性 PCM 流并避免削波/溢出

    我尝试将 2 个 16 位线性 PCM 音频流混合在一起 但似乎无法克服噪音问题 我认为它们是在将样品混合在一起时溢出的 我有以下功能 short int mix sample short int sample1 short int sam
  • CPU和GPU的区别

    CPU的单个处理单元和GPU的单个处理单元有什么区别 我在互联网上看到的大多数地方都涵盖了两者之间的高级差异 我想知道每条指令可以执行哪些指令 它们的速度有多快 以及这些处理单元如何集成到完整的架构中 这似乎是一个答案很长的问题 所以很多链
  • 在 spring jpa 实体中保存级联实体后缺少值

    我对 Spring 和 JPA 等比较陌生 我试图在标签和客户之间创建多对多关系 双向 我想我的关系是正确的 除了一个问题之外 一切都运行良好 保存到数据库后 Tag 值为 Null 所以我正在做的是 向客户添加新的标签列表 然后使用级联选
  • javascript中的子对象函数

    我知道您可以使用子对象和函数创建文字对象 var obj val 1 level1 val 2 val2 3 func function return this val2 console log obj val console log ob
  • 创建 Javascript 日历(完整,不弹出)

    我在创建 javascript 约会样式日历时遇到一些困难 虽然它确实进行了渲染 但我知道会有一种更有效的方法来实现它 有人有用于创建日历的模式吗 我将使用 jQuery 但我不想使用某人的日历插件 因为 a 我还没有找到适合我需要的插件
  • 修复 Google 地图折线的编码字符串

    我有一个编码字符串 我想用它在谷歌地图中画一条线 但由于反斜杠等特殊字符 Javascript 无法读取该字符串 不幸的是我对Javascript没有太多经验 而且我不知道如何转义这些字符 编码字符串 qikrIehwu WOKEIAIBG
  • MVC 和 JQuery:检索表单数据的最佳实践

    我有一些 JQuery 使用 Ajax 将信息发送回我的控制器进行处理 我这样做是这样的 Define my controls Get the values from my controls var param1 pName val Def
  • 零散的响应与浏览器响应不同

    我正在尝试用 scrapy 抓取此页面 http www barnesandnoble com s dref 4815 sort SA startat 7391 我得到的响应与我在浏览器中看到的不同 浏览器响应有正确的页面 而 scrapy
  • Angular2 Pipe 转换货币

    我创建了一个使用 api 转换货币的方法 如下所示 exchange Input string Output string value number number let inputRate this currencyStorage get
  • 休眠错误:当前事务被中止,命令被忽略直到事务块结束

    我随机在 catalina out 日志中看到相同的错误 WARNING SQL Error 0 SQLState 25P02 Sep 8 2010 11 50 13 PM org hibernate util JDBCExceptionR
  • Android 上的推送通知负载中的 gcm.notification.e=1 代表什么?

    我正在编写一个 Android 应用程序 它使用 Google Cloud Messaging 从服务器接收下游消息 当收到消息时onMessageReceived我打印了捆绑包并阅读了以下内容 RECEIVED PUSH NOTIFICA
  • 如何从 docker credStore 检索密码?

    我在用着docker credential desktop存储我的远程 docker 注册表的密码 据我了解 此命令应该检索我的注册表密码和用户名 docker credential desktop get https index dock
  • Web 应用程序加入 Azure Web Marketplace

    我们检查了这个文档 https blogs msdn microsoft com appserviceteam 2016 08 26 onboarding to azure web marketplace https blogs msdn
  • .Net XML 模式验证是否应该在到达第一个无效元素时停止?

    我加载了一个 XML 字符串和一个架构并将其传递到一个函数中 我让它根据模式正确验证 XML 但是它总是在第一个无效元素的范围内停止验证 无效数据 它会继续下去 无效 缺失属性 会继续下去 但无效元素 它会停止 并且不会在该范围内进一步验证