XmlReader ReadStartElement 导致 XmlException

2023-12-26

我正在 Silverlight 项目中使用 XmlReader 编写文件读取器。但是,我遇到了一些错误(特别是在 XmlReader.ReadStartElement 方法周围),这让我相信我误解了如何在某个地方使用它。

基本上,这是我正在使用的 Xml 格式的示例:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<root>
    <EmptyElement />
    <NonEmptyElement Name="NonEmptyElement">
        <SubElement Name="SubElement" />
    </NonEmptyElement>
</root>

这是一些代码的示例,其使用方式与我使用它的方式相同:

public void ReadData(XmlReader reader)
{
    // Move to root element
    reader.ReadStartElement("root");

    // Move to the empty element
    reader.ReadStartElement("EmptyElement");

    // Read any children
    while(reader.ReadToNextSibling("SubEmptyElement"))
    {
        // ...
    }

    // Read the end of the empty element
    reader.ReadEndElement();

    // Move to the non empty element
    reader.ReadStartElement("NonEmptyElement");    // NOTE: This is where I get the error.

    // ...
}

因此,本质上,我只是尝试读取每个元素和任何包含的子元素。我在突出显示的点处得到的错误如下:

错误描述

[Xml_InvalidNodeType] 参数:无、10,8 调试资源字符串不可用。通常,键和参数提供了足够的信息来诊断问题。看

错误堆栈跟踪

在 System.Xml.XmlReader.ReadStartElement(字符串名称) 在 - - - - - - - -

对此的任何建议或指导将不胜感激。

EDIT由于该读取器需要相当通用,因此可以假设 Xml 可能包含 EmptyElement 的子元素。因此,读取任何 SubEmptyElements 的尝试应该是有效的。


<SubElement/>不是以下的兄弟姐妹<EmptyElement>, so <NonEmptyElement>将被完全跳过,并且您的电话ReadEndElement()将读取结束元素</root>。当您尝试随后读取“NonEmptyElement”时,没有剩下任何元素,并且您将收到 XmlException:{“'None' 是无效的 XmlNodeType。第 8 行,位置 1。”}

还要注意的是,自从<EmptyElement/>为空,当您 ReadStartElement("EmptyElement") 时,您将读取整个元素,并且不需要使用 ReadEndElement()。

我还建议您将阅读器设置配置为 IgnoreWhitespace(如果您还没有这样做),以避免在您不期望的情况下读取(无关紧要的)空白文本节点而带来的任何复杂情况。

尝试将 NonEmptyElement 的 Read 向上移动:

public static void ReadData(XmlReader reader)
{
    reader.ReadStartElement("root");

    reader.ReadStartElement("EmptyElement");

    reader.ReadStartElement("NonEmptyElement");

    while (reader.ReadToNextSibling("SubEmptyElement"))
    {
        // ...
    }

    reader.ReadEndElement(/* NonEmptyElement */);

    reader.ReadEndElement(/* root */);
    // ...
}

如果你只是想跳过任何内容<EmptyElement>,无论其是否实际上为空,都使用ReadToFollowing:

public static void ReadData(XmlReader reader)
{
    reader.ReadStartElement("root");

    reader.ReadToFollowing("NonEmptyElement");

    Console.WriteLine(reader.GetAttribute("Name"));

    reader.ReadStartElement("NonEmptyElement");

    Console.WriteLine(reader.GetAttribute("Name"));
    while (reader.ReadToNextSibling("SubEmptyElement"))
    {
        // ...
    }

    reader.ReadEndElement(/* NonEmptyElement */);

    reader.ReadEndElement(/* root */);
    // ...
}

更新:这是一个更完整的示例,具有更清晰的数据模型。也许这更接近您的要求。

XMLFile1.xml:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<root>
  <Person Type="Homeless"/>
  <Person Type="Developer">
    <Home Type="Apartment" />
  </Person>
  <Person Type="Banker">
    <Home Type="Apartment"/>
    <Home Type="Detached"/>
    <Home Type="Mansion">
      <PoolHouse/>
    </Home>
  </Person>
</root>

程序.cs:

using System;
using System.Xml;

namespace ConsoleApplication6
{
    internal class Program
    {
        public static void ReadData(XmlReader reader)
        {
            reader.ReadStartElement("root");

            while (reader.IsStartElement("Person"))
            {
                ReadPerson(reader);
            }

            reader.ReadEndElement( /* root */);
        }

        public static void ReadPerson(XmlReader reader)
        {
            Console.WriteLine(reader.GetAttribute("Type"));
            bool isEmpty = reader.IsEmptyElement;
            reader.ReadStartElement("Person");
            while (reader.IsStartElement("Home"))
            {
                ReadHome(reader);
            }
            if (!isEmpty)
            {
                reader.ReadEndElement( /* Person */);
            }
        }

        public static void ReadHome(XmlReader reader)
        {
            Console.WriteLine("\t" + reader.GetAttribute("Type"));
            bool isEmpty = reader.IsEmptyElement;
            reader.ReadStartElement("Home");

            if (!isEmpty)
            {
                reader.Skip();
                reader.ReadEndElement( /* Home */);
            }
        }

        private static void Main(string[] args)
        {
            var settings = new XmlReaderSettings { IgnoreWhitespace = true };
            using (var xr = XmlReader.Create("XMLFile1.xml", settings))
            {
                ReadData(xr);
            }
            Console.ReadKey();
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XmlReader ReadStartElement 导致 XmlException 的相关文章

随机推荐

  • 典型相关分析

    我刚刚开始在 Matlab 中使用 CCA 我有两个向量X and Y维度的60x1920 and 60x1536样本数为60和不同向量集中的变量是1920 and 1536分别 我想知道如何进行 CCA 将它们减少到子空间 然后进行特征匹
  • MVC 将操作放入最合适的正确控制器中

    我只是想知道在某些情况下决定在哪里创建操作 视图的最佳实践方法是什么 If User有很多Video 创建操作 视图以显示用户视频的最佳位置在哪里 那么 在用户帐户页面的 我的视频 链接中 您是否 只需创建一个用户 我的视频行动和看法 cr
  • 从肥皂信封 zeep 获取数据

    我正在尝试在 python 库的帮助下使用 wsdlzeep https github com mvantellingen python zeep 它工作正常 但我不知道如何从请求中获取数据 My code encoding utf 8 f
  • 最小高度不适用于身体

    min height 不适用于 body html 吗 body html min height 100 绝对没有完成任何事情 firebug 报告正文 html 标签高度根本没有改变 首先 声明一个文档类型 以便您符合标准 如果您还没有这
  • 64位MFC版本中的访问冲突异常

    我正在尝试将 32 位应用程序移植到 64 位 计算似乎运行正确 但我无法正确配置视图 我在 W7 x64 机器上的 VS2005 中使用 MFC C 和 OpenGL Intel 10 0 027 编译器 发生崩溃时 我收到以下消息 3D
  • 跨实现确定性数组#shuffle

    可以将随机数生成器传递给Array shuffle这使得洗牌具有确定性 例如 在 MRI 1 9 3p327 中 1 2 3 4 shuffle random Random new 0 gt 1 2 4 3 1 2 3 4 shuffle
  • 使用 BeautifulSoup 抓取一系列表

    我正在尝试学习网络抓取和Python 以及相关的编程 并且发现了BeautifulSoup库 它似乎提供了很多可能性 我试图找出如何最好地从此页面提取相关信息 http www aidn org au Industry ViewCompan
  • 使用 AutoIt 循环解析 CSV 文件的所有行

    我有以下代码来读取包含两行数据的 csv 文件 我不知道这是怎么回事 如何改进它以读取包含两行数据的 csv 文件 include
  • 如何在Powerpoint VBA中运行宏“OnEnterSlide”或“OnLeaveSlide”?

    是否有某种事件允许在进入幻灯片或离开幻灯片时运行宏 SlideShowNextSlide 或 OnSlideShowPageChange 您可以在以下位置找到完整列表 http officeone mvps org vba events v
  • Android Room @Relation 多对多?

    我正在开发一个 Android 应用程序 并在 Android 操作系统中使用新的架构组件 LiveData ViewModel 和 Room 我在 Room 实现中遇到一个关于创建 Relation 的小问题 该 Relation 返回
  • 如何修复“java.sql.SQLException:数据库已关闭”问题

    我的代码说没有错误 但是当我运行该程序时 它会说数据库已关闭 public class main public static void main String args language SQLite String sql SELECT F
  • 用户管理API

    我正在开发一个应用程序套件 用户需要连接到服务器 并根据他们的帐户类型向他们提供一些服务 服务器将运行Linux 您能给我推荐一些用户管理 API 我可以用它来开发服务器程序吗 我所说的用户管理是指用户身份验证和其他相关功能 我更喜欢使用
  • 使用Python读取16位PNG图像文件

    我正在尝试读取以 16 位数据类型编写的 PNG 图像文件 数据应转换为 NumPy 数组 但我不知道如何读取 16位 文件 我尝试使用 PIL 和 SciPy 但它们在加载时将 16 位数据转换为 8 位数据 谁能告诉我如何从 16 位
  • 哪一个更好地处理版本控制? XmlSerializer 与 DataContractSerializer?

    需要序列化一个对象 并且反序列化时程序集版本可能发生变化 此外 对象可能会发生一些变化 XmlSerializer 不存储类型信息 如果对象发生一点变化 它也不会失败 但 XmlSerializer 无法序列化超类中的私有或内部属性 我无法
  • JAX-RS 资源生命周期性能影响

    我知道默认情况下 JAX RS 端点生命周期是每个请求一次 以便可以将请求特定信息注入到实例中 而且我们还可以制作一个端点Singleton的意思每个应用程序一次 其中请求特定信息不能注入到实例中 而是可以注入到请求的方法中 1 所以我想知
  • Struts 2:将不同的 XML 验证文件应用于一个操作方法

    我是 Struts 2 Framework 的新手 我使用 XML 验证文件来验证表单的字段 我的问题是 如何将不同的 XML 验证文件应用于一个操作的方法 我还想对不止一种操作方法使用相同的 XML 验证文件 问 如何将不同的 XML 验
  • GetHashCode() 在不同的服务器上给出不同的结果?

    我像这样声明了 C 代码行 int hashcode apple GetHashCode 在我的计算机 工作计算机和朋友的计算机上 结果是 1657858284 在开发服务器上 结果是 1548091822 有没有办法让我告诉项目始终使 G
  • 如何使用 Spring Data JPA + Spring Web MVC 避免 JSON 序列化中的延迟获取?

    我有一个在 Spring Web MVC 中使用 Spring Data JPA 和 REST 控制器的解决方案 持久性提供者是 Hibernate 持久层是使用 Spring 存储库构建的 并且在 REST 控制器和存储库之间存在一个服务
  • 从 Sidekiq 作业中获取错误消息

    我想从 sidekiq 作业中获取异常错误消息 当我将 back trace 选项设置为 true 时 它 会重试我的工作 但我想在出现错误时退出工作并获取错误消息 如果我发现该过程成功或失败就足够了 def perform text be
  • XmlReader ReadStartElement 导致 XmlException

    我正在 Silverlight 项目中使用 XmlReader 编写文件读取器 但是 我遇到了一些错误 特别是在 XmlReader ReadStartElement 方法周围 这让我相信我误解了如何在某个地方使用它 基本上 这是我正在使用