【问题标题】:C# Choose from two xml files to readC#从两个xml文件中选择读取
【发布时间】:2026-02-19 15:20:07
【问题描述】:

我想根据下面的comboBox19从两个文件中选择读取:

           if (comboBox19.Text == "01")  XmlReader reader = new XmlReader ("C:\\Ticket Format ID01.xml");
           else if (comboBox19.Text == "02" ) XmlReader reader = new XmlReader("C:\\Ticket Format ID02.xml");
            while (reader.Read())
            {
                if (reader.IsStartElement())
                {
                    switch (reader.Name)
                    {
                       case:// case coding here
                     }
                }
           }

但是编译的时候出错了。错误消息是“嵌入式语句不能是声明或标记语句”。 怎么解决这个问题?

【问题讨论】:

    标签: c#


    【解决方案1】:
    XmlTextReader reader = null; 
    
    if (comboBox19.Text == "01")   
        reader = new XmlTextReader ("C:\\Ticket Format ID01.xml");
    else if (comboBox19.Text == "02" ) 
        reader = new XmlTextReader ("C:\\Ticket Format ID02.xml");
    

    或者,如果您的文件都遵循相同的约定;

    var fileName = String.Format("C:\\Ticket Format ID{0}.xml", comboBox19.Text);
    var reader = new XmlTextReader (fileName);
    

    【讨论】:

    • 我都试过了,都得到了这个错误:无法创建抽象类或接口'System.Xml.XmlReader'的实例。
    • @Coolguy 更新反映,错过了那个。谢谢
    • 我在我的问题中编辑了编码。当我尝试使用 reader.Read() 调用 while 循环时发生错误。错误是:“使用未分配的局部变量'reader'”。为什么它仍然未分配?
    • 我输入了空值。但是当我用 reader.Read() 调用 while 循环时,发生了错误。错误是:未处理空引用异常。
    • @Coolguy 我建议您添加一个新问题,因为您最初的问题似乎已得到解答。
    【解决方案2】:

    您必须在使用前声明阅读器引用变量,或者将此代码包裹在花括号 {}(块)周围。

    XmlReader reader=null;
    
    if(comboBox19.Text == "01")
     reader =XmlReader.Create(@"C:\Ticket Format ID01.xml");
    else 
    if(comboBox19.Text == "02" ) 
     reader =XmlReader.Create(@"C:\Ticket Format ID02.xml");
    

    或者

      string fileName=string.Empty;
    
      if(comboBox19.Text == "01")
          fileName=@"C:\Ticket Format ID01.xml";
      else 
      if(comboBox19.Text == "02" ) 
          fileName=@"C:\Ticket Format ID02.xml";
    
      XmlReader reader=null;
      if(!string.IsEmptyOrNull(fileName))
        {
           reader=XmlReader.Create(fileName);
        }  
    

     using(XmlReader reader=XmlReader.Create(fileName)) 
     {
      ///
     }    
    

    【讨论】:

      【解决方案3】:

      您需要将 XmlReader 的声明移到 if 语句之外,并且由于 XmlReader 是一个抽象类,您不能直接从它创建实例。使用XmlTextReader 或静态方法XmlReader.Create。您还应该与ComboBox.SelectedValue 进行比较,而不是ComboBox.Text

      XmlReader reader;
      if (comboBox19.SelectedValue == "01")  
        reader = new XmlReader.Create("C:\\Ticket Format ID01.xml");
      else if (comboBox19.SelectedValue == "02" )
        reader = new XmlReader.Create("C:\\Ticket Format ID02.xml");
      

      【讨论】:

      • 我试过这个,但也失败了。报错“无法创建抽象类或接口'System.Xml.XmlReader'的实例”出来。
      • 是的...由于 XmlReader 是一个抽象类,您不能直接从它创建实例。尝试改用XmlTextReader 或静态方法XmlReader.Create
      • 我已经编辑了我的问题的编码,因为在我尝试使用 XMLTextReader 类进行编码后,当我使用 reader.Read() 调用 while 循环时发生错误。错误是:未处理空引用异常。
      • 您需要通过检查reader 不是null 来检查实例是否正确创建。如果是,那么您的 XML 文件路径有问题,或者所选值不是 0102
      • 当我检查阅读器值一开始不是“01”时问题解决了。我已将其更正为以值“01”开头。谢谢兄弟!
      【解决方案4】:
      XmlReader reader = null;
      if (textBox1.Text == "01")  reader = new XmlTextReader ("C:\\Ticket Format ID01.xml");
      else if (textBox1.Text == "02") reader = new XmlTextReader("C:\\Ticket Format ID02.xml");
      

      XMLReader 是一个 abstract 类,因此您无法创建它的实例。

      【讨论】:

      • 我试过这个,但也失败了。报错“无法创建抽象类或接口'System.Xml.XmlReader'的实例”出来。
      • 要么 reader = new XmlTextReader ("filename.xml") 要么 reader = XmlReader.Create("filename.xml");应该工作
      • 我已经编辑了我的问题的编码,因为在我尝试使用 XMLTextReader 或 XMLReader 进行编码之后。当我使用 reader.Read() 调用 while 循环时发生错误。错误是:未处理空引用异常。
      • 也请分享您的xml
      • 问题是当我只从一个文件中读取时(没有 if else)没有问题。现在我使用 if else 来选择一个文件,那么问题就来了。
      【解决方案5】:

      如果我们想将 if 语句的作用域限制为一行,则 if 语句不是必须有 {}。但是,我们不能将变量声明作为其后面的唯一行。这是因为如果条件结果为 false,则永远不会创建变量。

      所以,在条件之前声明 XMLReader。或将您的条件代码包装在{}

        XmlReader reader = null;
      if (textBox1.Text == "01")
        reader = new XmlTextReader ("C:\\Ticket Format ID01.xml");
      else if (textBox1.Text == "02")
       reader = new XmlTextReader("C:\\Ticket Format ID02.xml");
      

      详情请见this link

      【讨论】:

      • 我试过这个,但也失败了。报错“无法创建抽象类或接口'System.Xml.XmlReader'的实例”出来。
      • 请再次查看代码,我们通过 XMLTextReader 类获取 XMLReader 的实例。确保复制准确的代码。
      • 我已经编辑了我的问题的编码,因为在我尝试使用 XMLTextReader 类进行编码后,当我使用 reader.Read() 调用 while 循环时发生错误。错误是:未处理空引用异常。