【问题标题】:Accessing XML File Over Network通过网络访问 XML 文件
【发布时间】:2017-03-08 20:41:02
【问题描述】:

我已经在这个管理应用程序上工作了几个星期,它几乎完成了。当用户单击保存按钮时应该发生什么,VerifyFields() 方法被调用。之后,它应该询问用户是否要保存并发送电子邮件。一旦用户单击是,它应该向 XML 文件中的电子邮件地址发送电子邮件。我收到错误消息“文件:DREmailAddresses.xml 未在:\fs01\Applications\EMS-Manager 中找到。”但是,该文件在那里并且可以访问。我已经复制了下面的相关代码以及image of the error.

// Begin Email Section
    public bool VerifyFields()
    {
        var status = false;
        switch (tbxDynPartNumber.Text)
        {
            case "":
                MessageBox.Show(@"Enter Dynalab Part#", @"Input Needed", MessageBoxButtons.OK, MessageBoxIcon.Error);
                status = true;
                break;
        }
        switch (tbxSupplier.Text)
        {
            case "":
                MessageBox.Show(@"Enter Supplier Name", @"Input Needed", MessageBoxButtons.OK, MessageBoxIcon.Error);
                status = true;
                break;
        }
        switch (tbxInitiatedBy.Text)
        {
            case "":
                MessageBox.Show(@"Enter Initiator Name", @"Input Needed", MessageBoxButtons.OK, MessageBoxIcon.Error);
                status = true;
                break;
        }
        switch (orderQty.Text)
        {
            case "0":
                MessageBox.Show(@"Order Quantity Must Be Greater Than 0!", @"Input Needed", MessageBoxButtons.OK, MessageBoxIcon.Error);
                status = true;
                break;
        }

        switch (dtpDate.Text)
        {
            case "":
                MessageBox.Show(@"Enter A Valid Date.", @"Input Needed", MessageBoxButtons.OK, MessageBoxIcon.Error);
                status = true;
                break;
        }
        switch (tbxDescription.Text)
        {
            case "":
                MessageBox.Show(@"Enter Description", @"Input Needed", MessageBoxButtons.OK, MessageBoxIcon.Error);
                status = true;
                break;
        }

        switch (tbxLocation.Text)
        {
            case "":
                MessageBox.Show(@"Enter Location", @"Input Needed", MessageBoxButtons.OK, MessageBoxIcon.Error);
                status = true;
                break;
        }
        switch (tbxDiscrepancyDescription.Text)
        {
            case "":
                MessageBox.Show(@"Enter Discrepancy Description", @"Input Needed", MessageBoxButtons.OK, MessageBoxIcon.Error);
                status = true;
                break;
        }
        return status;
    }

    public void PrepareEmail(string subject, string message)
    {
        if (MessageBox.Show(@"Are you sure you want to save and send Discrepancy Report: " +tbxDRNumber.Text + @"?\n Click YES to save\n Click NO to cancel" , @"Confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
        {

            SendEmail(subject,message);
        }
    }
    public Array AddEmail()
    {
        string[] dRemail = { "", "", "" };
        if (File.Exists(@"\\fs01\Applications\EMS-Manager\DREmailAddresses.xml"))
        {
            XmlReader emailDocument = new XmlTextReader(@"\\fs01\Applications\EMS-Manager\DREmailAddresses.xml");
            while (emailDocument.Read())
            {
                var type = emailDocument.NodeType;
                switch (type)
                {
                    case XmlNodeType.Element:
                        if (emailDocument.Name == "DRCreatedAddEmail")
                        {
                            dRemail[0] = emailDocument.ReadInnerXml();
                        }
                        if (emailDocument.Name == "DRActionNeededAddEmail")
                        {
                            dRemail[1] = emailDocument.ReadInnerXml();
                        }
                        if (emailDocument.Name == "DRPendingAddEmail")
                        {
                            dRemail[2] = emailDocument.ReadInnerXml();
                        }
                        else
                        {
                            MessageBox.Show(
                                @"The file: 'DREmailAddresses.xml' was not found at: \\fs01\Applications\EMS-Manager");
                        }
                        break;
                }
            }
        }
        return dRemail;
    }

【问题讨论】:

  • 不是答案,而是 docs for XmlTextReader say“从 .NET Framework 2.0 开始,我们建议您使用 XmlReader.Create 方法创建 XmlReader 实例以利用新功能。 "
  • 看代码好像没看懂switch语句。所有这些都可以用简单的 if 语句来完成。
  • 您对 if 语句是正确的。修改代码以使用 if 语句代替 switch 语句可能很有用。另外我对编程很陌生,还在学习。我自学了一切,我犯了错误,这都是学习的一部分。然而,我们下周在课堂上讨论 Switch 语句。感谢您的意见。

标签: c# xml winforms


【解决方案1】:

如果您收到该错误消息,那么您的代码已通过 File.Exists 的检查并通过了文档的阅读,但只是点击了“if (emailDocument.Name == "DRPendingAddemail" 的 else 分支)”检查。

所以你的函数应该接近这个

public Array AddEmail()
{
    string[] dRemail = { "", "", "" };
    if (File.Exists(@"\\fs01\Applications\EMS-Manager\DREmailAddresses.xml"))
    {
        XmlReader emailDocument = new XmlTextReader(@"\\fs01\Applications\EMS-Manager\DREmailAddresses.xml");
        while (emailDocument.Read())
        {
            var type = emailDocument.NodeType;
            switch (type)
            {
                case XmlNodeType.Element:
                    if (emailDocument.Name == "DRCreatedAddEmail")
                    {
                        dRemail[0] = emailDocument.ReadInnerXml();
                    }
                    else if (emailDocument.Name == "DRActionNeededAddEmail")
                    {
                        dRemail[1] = emailDocument.ReadInnerXml();
                    }
                    else if (emailDocument.Name == "DRPendingAddEmail")
                    {
                        dRemail[2] = emailDocument.ReadInnerXml();
                    }
                    else
                    {
                        MessageBox.Show("Unknown node type " + emailDocument.Name);
                    }
                    break;
            }
        }
    }
    else
    {
         MessageBox.Show(@"The file: 'DREmailAddresses.xml' was not found at: \\fs01\Applications\EMS-Manager");
    }
    return dRemail;
}

【讨论】:

  • 谢谢。我会试试你的建议。我什至没有意识到它正在检查所有这些条件。另外,由于我是 SO 新手,我该如何接受答案?
  • 我已经从 switch 语句转换为 if 语句,并且得到了相同的结果。
  • 确保你有 else 语句,我把它放在我的例子中。如果您知道如何在 Visual Studio 中使用调试器,请在两条 else 语句中放置一个断点,然后查看执行的是哪一条。需要注意的一件事是,我添加了一个新的代码路径,您的旧 MessageBox 曾经在该路径中显示不同的错误消息,因此请确保您看到正确的消息(“找不到文件”与“未知节点类型”)
  • 好的,您的解决方案确实有帮助,我现在明白您为什么创建未知节点类型消息框了。我现在收到消息:“未知节点类型数据。”显然第一部分是字符串“未知节点类型”,第二部分是 emailDocument.Name。因此,查看我没有创建的 XML 文件,我发现 我猜它正在使用 作为节点类型并且它是未知的。
  • 您可以发送一份您的 XML 文件的副本吗?仅供参考,XMLReader 的工作方式,如果您有类似以下的文档 (pastebin.com/YVX38ezw),XML Reader 的工作方式,在 while(emailDocument.read()) 循环的第一次运行中,它将是查看 A 元素,下一个循环是 B,下一个是 D,然后是 C,然后是 E。
猜你喜欢
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
相关资源
最近更新 更多