使用 C# 中的架构进行 XML 解析

2024-01-02

我正在编写一些在运行时加载 xml 文件的代码。目前,我们使用 XmlDocument 类型来读取 xml 文件,并在 SelectSingleNode 语句周围包装一个 try-catch(这是在节点为 null 或在我们解析用户时不存在的情况下完成的)创建的 xml 文件)。

请注意:我意识到 XmlDocument 已被 XDocument 取代。然而,由于我们正在使用 .NET 版本 3 (根据这个MSDN文档 http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspxXDocument 在 .NET 3 中不可用),我们现在必须坚持使用 XmlDocument。我们出于多种原因使用 .NET 3(其中一些与规范相关)。

这是我们目前正在做的一个示例:

private void LoadUserXMLFile ()
{
    XmlDocument xDoc = new XmlDocument();
    XmlTextReader reader = new XmlTextReader(fileName);
    reader.Read();
    xDoc.Load(reader);

    try { firstElementString = xDoc.SelectSingleNode(<path to node>).InnderText);
    catch { <exception handling here > }
    //more SelectSingleNode statements, each wrapped inside
    //individual try-catch blocks
}

显然上面是一个例子,我简化了catch语句。

我已经为该应用程序将使用的用户生成的 XML 文件编写了一个架构,我想知道在解析 XML 文档期间是否使用了该架构(以某种方式),我是否仍然需要用 try 包装每个 SelectSingleNode -catch 语句?

是否可以在解析过程中(以某种方式)使用模式来检查 XML 文档是否具有正确的格式和所有必需的元素?


是的,您需要使用验证阅读器

你可以使用这样的东西

XmlTextReader r = new XmlTextReader("C:\\Xml\\MyXmlFile.xml");
v.ValidationType = ValidationType.Schema;

显然,您的 xml 将引用该架构,因此这就是对该架构的引用的解析方式(在 xml 本身中),如下所示

<Employee EmployeeId="12345566" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="Employee.xsd">
   <PersonName>Krystan</PersonName>
</Employee>

如果您无法更改 xml,您可以像这样使用 XmlReaderSettings

public void SomeMethod()
{
    XmlReaderSettings xmlsettings = new XmlReaderSettings();
    xmlsettings.Schemas.Add("http://www.company.com/blah", "blah.xsd");
    xmlsettings.ValidationType = ValidationType.Schema;
    xmlsettings.ValidationEventHandler += new ValidationEventHandler(ValidationHandler);

    XmlReader reader= XmlReader.Create("somefile.xml", xmlsettings);

    while (reader.Read()) { }
}

public void ValidationHandler(object sender, ValidationEventArgs args)
    void booksSettingsValidationEventHandler(object sender, ValidationEventArgs e)
{
    if (e.Severity == XmlSeverityType.Warning)
    {
        Console.Write("WARNING: ");
        Console.WriteLine(e.Message);
    }
    else if (e.Severity == XmlSeverityType.Error)
    {
        Console.Write("ERROR: ");
        Console.WriteLine(e.Message);
    }
}

要回答您的问题,如果您已针对模式进行验证并选择已知存在的节点,您可以免除每个节点的异常处理,但显然您应该防止因文件加载等原因可能发生的异常。

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

使用 C# 中的架构进行 XML 解析 的相关文章

随机推荐

  • Angular 6:onChange mat-slide-toggle 条件验证从对象数组中仅选择一个选项

    我有一份清单mat slide toggle 一次只有一个滑块将保持启用状态 而其他滑块将保持禁用状态 现在 当单击该启用的滑块时 其值将被更改 同时其他滑块列表将被启用以供选择 一旦选择一个滑块 其他滑块将被禁用 所以 简而言之 整个数组
  • 为什么字节码编程不如汇编编程那么流行或盛行?

    您可以在互联网上看到汇编代码和汇编编码器 但几乎没有字节码 这是为什么 汇编编程的需求和优点也适用于字节码编程 字节码编程远不如汇编编程流行 常见的另一个原因是字节码的通用性 它的简单性 字节码指令集主要是 ultra RISC 非常简单的
  • 为什么在 Dao 设计模式或其他设计模式中使用接口

    请参阅以下 Dao 设计模式的组成部分 数据访问对象模式或 DAO 模式用于将低级数据访问 API 或操作与高级业务服务分开 以下是数据访问对象模式的参与者 数据访问对象接口 该接口定义要在模型对象上执行的标准操作 数据访问对象具体类 该类
  • TypeScript 编译中的实验装饰器警告

    我收到警告 对装饰器的实验性支持是一项在未来版本中可能会发生变化的功能 设置 experimentalDecorators 选项 以删除此警告 即使我的 tsconfig json 中的compilerOptions具有以下设置 emitD
  • 提交时如何将 Git 提交 ID 填充到文件中?

    我想创建 Git 钩子 它将填充我将要在源代码中创建的文件 基本上是变量替换 的提交的提交 ID 这可以用 Git 实现吗 或者事实上 通过将变量解析为 git id 我将更改 sha 1 从而导致 先有鸡还是先有蛋 的问题 我针对类似情况
  • Cucumber @Before 钩子运行两次 @After 一次

    给所有人 目前正在写一个BDD测试自动化框架 使用Java11 Junit5 Cucumber Selenium 构建工具 Gradle 创建了一个用于验证 Google 标题的小测试 开始测试时 使用Test task在 Gradle 或
  • 如何在 jQuery 中获取图像的当前位置?

    我一直在开发一个具有背景的图像处理脚本 用户可以将一个或多个图像上传到该背景上 我希望用户能够在背景周围拖动和移动 最后他们可以生成最终图像 但是 我不知道如何获取 BG 上可拖动图像位置的位置 我一直在互联网和电子书上搜索 但没有任何线索
  • htaccess 带有 PHP 和 URL 变量的漂亮 URL

    希望有人可以在这里提供一些帮助 这是一个涉及多个层面的问题 简而言之 我想要拥有漂亮的 URL 这些 URL 使用文件夹中文件的 URL 变量 所以 我想要http www example com page path to page htt
  • 未定义的方法“save”使测试在测试结束之前失败

    我正在关注 ruby railstutorial org 我遇到了一些麻烦 但我解决了它们 然而 现在我在谷歌上搜索了相当长的一段时间 检查了代码 我什至知道为什么测试失败 但不知道如何让它通过 所以 问题来了 我有一个用户模型 class
  • 无法将密钥发送到定向 Paypal 登录页面

    我正在为 Paypal Checkout 编写一个自动填充机器人 paypal 登录页面是从另一个网站重定向的 因此与官方 paypal 登录页面略有不同 尽管 HTML 类似 我尝试过不同的方法 比如switch to frame scr
  • 运行 Spring MVC 测试时出现 NoSuchMethod 错误

    我正在尝试按照 Spring in Action 第四版 第 5 章中的示例来创建我自己的项目 仍然是企业级的新手 我正在使用 Windows 7 PC Java 7 Spring 4 和 Maven 当我运行 ClinicalNoteCo
  • Hbase快速统计行数

    现在我实现了行计数ResultScanner像这样 for Result rs scanner next rs null rs scanner next number 如果数据达到百万次计算量很大 我想实时计算我不想使用Mapreduce
  • Spring框架4.3.0 - 我什么时候需要@Autowired?

    我刚刚开始学习 Spring 框架 我使用版本 4 3 0 我认为我们需要 Autowired 来告诉框架何时一个类需要注入 不过 我今天尝试这样做 Component public class CDPlayer implements Me
  • 如何在 C++ 中创建动态数组的数组

    我正在尝试学习 C 并尝试为简单的哈希表编写代码 如下结构 array 0 0 array 0 1 array 0 2 key 1 value 1 value 2 array 1 0 array 1 1 key 2 value 3 arra
  • SQLAlchemy 关系加载器在表上留下锁?

    我有非常简单的代码导致我的 MySQL 数据库挂起 import sqlalchemy as sa from sqlalchemy import orm creating the engine the base etc import uti
  • 如何在 Jetty 中部署 Servlet?

    我创建了一个简单的 Servlet 我想将其部署在 Jetty 7 2 中 Jetty 正在运行并且能够为 JSP 页面提供服务http localhost 8080 jonas test jsp 我用 Jetty 启动java jar s
  • React 18 TypeScript 儿童 FC

    我升级到 React 18 并且编译得很好 如今 似乎每个使用子组件的组件都会抛出错误 Property children does not exist on type IPageProps 在儿童道具自动包含在之前FC界面 现在看来我必须
  • 将 IN 子句与 PIG FILTER 结合使用

    PIG 支持 IN 子句吗 filtered FILTER bba BY reason not in a b c d 或者我应该把它分成多个 OR Thanks 您可以使用 Apache DataFu 中的以下 udf 代替 这将帮助您避免
  • 如何在 JPA 2.0 项目中加载 Hibernate 'xxx.hbm.cfg' 文件?

    我刚刚启动了一个 Spring Roo 应用程序 使用 Hibernate 作为 JPA2 0 提供程序 我使用罐 子的方式如下 hibernate core 3 6 4 Final jar hibernate commons annota
  • 使用 C# 中的架构进行 XML 解析

    我正在编写一些在运行时加载 xml 文件的代码 目前 我们使用 XmlDocument 类型来读取 xml 文件 并在 SelectSingleNode 语句周围包装一个 try catch 这是在节点为 null 或在我们解析用户时不存在