VB.NET 根据 XSD 文件验证 XML 文件并解析 xml

2023-12-04

我需要做什么?我需要根据 XSD 文件(传递文件路径/位置)验证 XML 文件(传递文件路径/位置)。我需要检查它的格式是否正确,没有非法字符,并且它具有 XSD 中定义的所有标签,即没有丢失标签。它与 xsd 中定义的数据类型匹配。完成之后,我需要解析 xml 文件以获取数据并将其存储在数据库中。

问题? 1)使用 XmlReaderSetttings 与 XmlDocument 和 XmlReader 与 Validate 方法将帮助我实现我所需要的吗?任何人都可以帮我提供示例代码吗?

2)解析 xml 文件以获取特定标签的最佳方法是什么?

我是 VB.net 新手,因此任何示例代码帮助将不胜感激。谢谢!


是的,您走在正确的道路上。验证 XML 文档可以使用以下任一方法完成XmlDocument or XmlReader(正如我稍后将描述的,您还可以使用XDocument)。您选择哪一种取决于您的情况,但它们的工作原理相似。当他们发现文档有错误时,他们会致电ValidationEventHandler代表。这XmlReader通过中的事件调用它XmlReaderSettings对象而XmlDocument通过作为参数传递给其的委托来调用它Validate方法。这是一个可用于收集错误的简单类:

Public Class XmlValidationErrorBuilder
    Private _errors As New List(Of ValidationEventArgs)()

    Public Sub ValidationEventHandler(ByVal sender As Object, ByVal args As ValidationEventArgs)
        If args.Severity = XmlSeverityType.Error Then
            _errors.Add(args)
        End If
    End Sub

    Public Function GetErrors() As String
        If _errors.Count <> 0 Then
            Dim builder As New StringBuilder()
            builder.Append("The following ")
            builder.Append(_errors.Count.ToString())
            builder.AppendLine(" error(s) were found while validating the XML document against the XSD:")
            For Each i As ValidationEventArgs In _errors
                builder.Append("* ")
                builder.AppendLine(i.Message)
            Next
            Return builder.ToString()
        Else
            Return Nothing
        End If
    End Function
End Class

The ValidationEventHandler该类中的方法与ValidationEventHandler委托,因此您可以使用它来收集来自XmlReader or the XmlDocument。以下是您如何将其与XmlDocument:

Public Function LoadValidatedXmlDocument(xmlFilePath As String, xsdFilePath As String) As XmlDocument
    Dim doc As New XmlDocument()
    doc.Load(xmlFilePath)
    doc.Schemas.Add(Nothing, xsdFilePath)
    Dim errorBuilder As New XmlValidationErrorBuilder()
    doc.Validate(New ValidationEventHandler(AddressOf errorBuilder.ValidationEventHandler))
    Dim errorsText As String = errorBuilder.GetErrors()
    If errorsText IsNot Nothing Then
        Throw New Exception(errorsText)
    End If
    Return doc
End Function

以下是您如何将它与XmlReader:

Public Sub LoadXml(xmlFilePath As String, xsdFilePath As String) 
    Dim settings As New XmlReaderSettings()
    settings.Schemas.Add(Nothing, xsdFilePath)
    settings.ValidationType = ValidationType.Schema
    Dim errorBuilder As New XmlValidationErrorBuilder()
    AddHandler settings.ValidationEventHandler, New ValidationEventHandler(AddressOf errorBuilder.ValidationEventHandler)
    Dim reader As XmlReader = XmlReader.Create(xmlFilePath, settings)
    ' Read the document...
    Dim errorsText As String = errorBuilder.GetErrors()
    If errorsText IsNot Nothing Then
        ' Handle the errors
    End If
End Function

或者,您也可以使用较新的XDocument班级。这样做的方法XDocument非常类似于XmlDocument。有一个Validate的扩展方法为XDocument这再次需要一个ValidationEventHandler代表。这是一个例子:

Public Function LoadValidatedXDocument(xmlFilePath As String, xsdFilePath As String) As XDocument
    Dim doc As XDocument = XDocument.Load(xmlFilePath)
    Dim schemas As New XmlSchemaSet()
    schemas.Add(Nothing, xsdFilePath)
    Dim errorBuilder As New XmlValidationErrorBuilder()
    doc.Validate(schemas, New ValidationEventHandler(AddressOf errorBuilder.ValidationEventHandler))
    Dim errorsText As String = errorBuilder.GetErrors()
    If errorsText IsNot Nothing Then
        Throw New Exception(errorsText)
    End If
    Return doc
End Function

至于将 XML 文档中的数据加载到数据库中,如果不知道 XML 文档的架构、数据库的架构、数据库的类型等,就不可能准确地说出如何做到这一点。我建议这样做一些关于读取 XML 数据和将数据写入数据库的研究,看看您能走多远。如果您遇到麻烦时有任何具体问题,我们将随时为您提供帮助:)

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

VB.NET 根据 XSD 文件验证 XML 文件并解析 xml 的相关文章

  • 如何使用 VB.NET 打开受密码保护的共享网络文件夹?

    我需要在网络上打开受密码保护的共享文件夹才能访问 Access 97 数据库 如何打开文件夹并输入密码 在这里找到http www mredkj com vbnet vbnetmapdrive html http www mredkj co
  • CakePHP Xml 实用程序库触发 DOMDocument 警告

    我正在使用 CakePHP 在视图中生成 XMLXML核心库 http book cakephp org 2 0 en core utility libraries xml html xml Xml build data array ret
  • 管理调试和发布连接字符串

    在 NET SQLServer 应用程序中管理调试和发布连接字符串的好方法是什么 我有两个 SQL Server 一个是生产服务器 一个是构建 调试服务器 我需要一种在部署 ASP NET 应用程序时在这两个服务器之间进行切换的方法 目前
  • Jackson XML ArrayList 输出具有两个包装器元素

    我在 Jackson 生成的 XML 输出中得到了两个包装器元素 我只想拥有一个 我有一个 Java bean Entity Table name CITIES JacksonXmlRootElement localName City pu
  • 如何在Android中解析xml类型的HTTPResponse

    我有一个 Android 应用程序 我使用 POST 方法来获取响应 这是我的代码 HttpResponse httpResponse httpclient execute httppost HttpEntity resEntity htt
  • 如何打开 Windows 资源管理器窗口并选择特定文件夹

    我有一个 winform 应用程序 这个 winform 应用程序创建了几个文件 我想在我的应用程序中实现 查找目标 功能来显示这些文件 这些文件位于同一文件夹中 看图片 假设我创建了几个文件 C Test 文件夹 该文件夹包含以下文件 C
  • 在 JAVA 中使用 SAX 解析器从 XML 文件中提取文本节点

    因此 我目前正在使用 SAX 尝试从我正在处理的大量 xml 文档中提取一些信息 到目前为止 提取属性值确实很容易 但是 我不知道如何从文本节点中提取实际值 例如 在给定的 XML 文档中
  • xml 模式属性参考

    我有这个 xml 模式
  • REXX 或 JCL 中的 XML 处理

    在 PS 文件中 我有如下 XML 数据 For ex
  • 使用 sed 更新 xml 属性(Windows + cygwin 和 Linux)?

    我需要使用 sed 命令对 xml 文件进行更新 但我在这方面遇到了麻烦 它需要在 Windows 使用 cygwin 和 Linux 上运行 XML 具有以下元素
  • Android - 保存动态更改布局的状态

    我有一个布局 用户可以在其中添加按钮并将其放置在他们想要的位置 我想允许用户保存他们的布局 以便下次打开应用程序时加载它 有谁知道我是否可以将文件保存到 SD 卡上 或者 我可以使用某种layout getXml 方法并将其放入我的应用程序
  • 在 bash 脚本中提取 XML 值 [重复]

    这个问题在这里已经有答案了 我正在尝试从 xml 文档中提取一个值 该文档已作为变量读入我的脚本中 原始变量 data is
  • 合并xml文档

    我遇到的所有关于合并 XML 文档的解决方案都无法实现我的愿望 让我解释 XML 文档 1 a b title Original Section b title Original Child Section b b title Origin
  • 如何更换HXT中的节点?

    给定一个示例 xml 文件
  • 如何从 MySQL 数据查询创建 XML 文件?

    我想知道一种仅使用 MySQL 查询创建 XML 文件的方法 根本不使用任何脚本语言 有关于这个主题的书籍 教程吗 UPDATE 我想澄清一下 我想使用 sql 查询将 XML 数据转发到 php 脚本 Here s 关于从 MySQL S
  • 从基本表单加上 XML 生成自定义表单文档?

    这是我的第一次堆栈溢出 而且很复杂 对不起 我的任务是从基本模板和一些 XML 生成自定义文档without每种情况都有一个自定义表单设计元素 Here s 整个画面 我们正在构建一个 Lotus Notes 客户端 而不是 Web 应用程
  • python suds SOAP 请求中的名称空间前缀错误

    我使用 python suds 来实现客户端 并且在发送的 SOAP 标头中得到了错误的命名空间前缀 用于定义由element ref 在 wsdl 中 wsdl 正在引用数据类型 xsd 文件 请参见下文 问题出在函数上GetRecord
  • Ebay api GetSellerList,解析响应 XML

    我正在使用 eBay 交易 api 来获取当前列出的卖家股票 我正在使用 GetSellerList 调用 我在解析 xml 时遇到问题 然后将其插入到网站商店中 这是 xml 请求
  • SQL存储过程执行时间差异

    我在 win form 应用程序中遇到奇怪的问题 我正在调用一个存储过程 并且执行大约需要 6 秒 此存储过程接受多个参数 包括一个输出参数 从应用程序级别我使用 Dim dt1 DateTime Now cmd ExecuteNonQue
  • 基于xsd模式生成xml(使用.NET)

    我想根据我的 xsd 架构 cap xsd 生成 xml 文件 我找到了这篇文章并按照说明进行操作 使用 XSD 文件生成 XML 文件 https stackoverflow com questions 6530424 generatin

随机推荐

  • 如果一个帐户有多个邮箱,VBA 选择邮箱

    这是我的要求 我在 OUTLOOK 中配置了多个帐户 1 电子邮件受保护 只有一个邮箱 2 电子邮件受保护 有多个邮箱 在 Unix box Windows Box Mac box 在这里 我的第二个电子邮件帐户有自己的邮箱 并链接到多个邮
  • 获取时对集合中的文档进行排序

    我有一个在 MongoDB 上称为资源的集合 它有以下文件 id Abb e class Resource resourceEmail email protected id Dasd tt class Resource resourceEm
  • 我如何在magento会话中保存数组?

    我想在会话变量中保存一个数组 如何使用 magento 会话来做到这一点 并且该数组应该是可更新的 即 我将在用户执行的不同操作时向该数组添加值 有人可以给我一个提示吗 Thanks 最简单的方法是使用客户会话对象的 setData 方法
  • 如何创建仅存在于 ResourceDictionary 上下文中的样式

    如何创建仅存在于 ResourceDictionary 上下文中但不存在于包含该 ResourceDictionary 的控件上下文中的样式 例如 我希望能够拥有一个如下所示的 ResourceDictionary
  • C++中的文件按修改时间排序

    C 中如何按修改时间对文件进行排序 std sort需要一个比较功能 它以向量作为参数 我想根据修改对文件进行排序 是否已经有比较函数或 API 可用于实现此目的 是的 您可以使用std sort并告诉它使用自定义比较对象 如下所示 inc
  • 课程完成按什么顺序排列其结果?

    示例 我创建一个新单元 声明一个具有多种方法 如构造函数 析构函数 method1 method2 method3 的类 然后按 Ctrl Shift C IDE 自动创建所有方法体 但顺序是混合的 并且与接口部分中声明的顺序不同 现在 这
  • 如何获取csc.exe路径?

    有没有办法获取最新 NET Framework 的 csc exe 路径 该文件通常位于 c Windows Microsoft NET Framework vX X XXX 但问题是可以安装多个版本 同时存在 32 位和 64 位版本 有
  • 论坛标签。实施它们的最佳方法是什么?

    我正在构建一个论坛 我想使用论坛风格的标签来让用户以有限的方式格式化他们的帖子 目前我正在使用正则表达式来执行此操作 根据这个问题 如何使用C 正则表达式模拟论坛标签 问题是正则表达式不区分嵌套标签 以下是我如何实现此方法的示例 publi
  • 来自 asp.net ASHX 页面的 FullCalendar 事件未显示

    我一直在尝试使用以下代码调用 ASHX 页面 将一些事件添加到 fullCalendar 中 页面脚本
  • 如何在 Ruby 中处理组合 []+= 以实现自动激活哈希?

    为了实现 Ruby 哈希的自动激活 可以使用以下类 class AutoHash lt Hash def initialize args super update update index args 0 update args 0 upda
  • 如何将 js 模块导入 TypeScript 文件?

    我有一个量角器项目 其中包含这样一个文件 var FriendCard function card var webElement card var menuButton var serialNumber this getAsWebEleme
  • 定义一个指针来引用相同的变量名引用?

    在 Objective C 中 我真的无法理解这一点 void x x 我的理解是 声明一个泛型指针 因此类型为 void 指针变量名为 x 该指针指向变量的引用 应该已经声明了 但事实并非如此 名为 x 让我很困惑 判断该声明是否成立 v
  • 将 `__getattr__` 方法添加到现有对象实例[重复]

    这个问题在这里已经有答案了 我希望这个工作 import types def new getattr self args kwargs return 2 class A def init self pass a A a getattr ty
  • 使用 rowspan 时 IE 设置行高不起作用

    只是想知道为什么下面的 HTML 不起作用 基本上 当我在表行上设置 rowspan 时 IE 似乎会忽略我设置的高度 table border 1 cellpadding 0 cellspacing 0 width 100 tr td h
  • 如何在 HLSL 中使用巨大数组(错误 X4505)

    当我尝试编译时出现错误 X4505 临时寄存器和可转位临时寄存器的总和超出限制 共 4096 个 然而我的shader确实工作于特效作曲家 它崩溃的原因可能是因为我使用了一个非常大的数组 因为我使用的是行进立方体 const static
  • 如何修复我的 Android Soundboard 应用程序的“Google 移动广告 SDK 初始化不正确”问题

    将 Google 广告横幅添加到我的 Android Studio 项目不起作用 如果有人能帮助我 我将非常非常感激 我只是不明白我做错了什么 我遵循的教程是 https www youtube com watch v w7muIkMYE
  • 在 Android 中创建一个空位图并通过画布进行绘制

    我想创建一个空位图并将画布设置为该位图 然后在位图上绘制任何形状 这可能比您想象的更简单 int w WIDTH PX h HEIGHT PX Bitmap Config conf Bitmap Config ARGB 8888 see o
  • 换行符
    未按预期呈现

    知道为什么我的果岭上方有一条细细的灰线吗 and how to get rid of it Thanks https jsfiddle net Lc7gym88 hr border bottom 4px solid 469551 width
  • JTable自定义单元格渲染器焦点问题

    我有一张这样的桌子 第二列使用 JTextField 渲染器 第三列使用基于 JPasswordField 的渲染器和编辑器 看起来不错 但问题是我们必须输入值并且必须按 ENTER 在该图像中 我输入了密码 但没有按 Enter 键 因此
  • VB.NET 根据 XSD 文件验证 XML 文件并解析 xml

    我需要做什么 我需要根据 XSD 文件 传递文件路径 位置 验证 XML 文件 传递文件路径 位置 我需要检查它的格式是否正确 没有非法字符 并且它具有 XSD 中定义的所有标签 即没有丢失标签 它与 xsd 中定义的数据类型匹配 完成之后