【问题标题】:save xml file using streamwriter使用streamwriter保存xml文件
【发布时间】:2014-08-18 17:02:18
【问题描述】:

我正在尝试找到一种方法将数据保存回编码为“iso-8859-7”的 xml 文件。

首先使用

加载 xml
    public XmlDocument LoadDocument(String x)
    {
        XmlDocument document = new XmlDocument();
        StreamReader stream = new StreamReader(xml, Encoding.GetEncoding("iso-8859-7"));
        document.Load(stream);
        return (document);
    }

在表单控件中加载属性,然后在单击保存按钮时加载

    private void savebtn_Click(object sender, EventArgs e)
    {
        XmlNodeList attributes = commonMethods.LoadDocument(xml).DocumentElement.SelectNodes("//Class[@Name='" + classname + "']/Property[@Id='" + id + "']/attribute::*");
        for (int x = 0; x < attributes.Count; )
        {
            foreach (Control ctr in table1.Controls)
            {
                if (ctr is TextBox)
                {
                    if (ctr.Text == attributes[x].Value.ToString()) { x++; }
                    else
                    {
                        attributes[x].Value = ctr.Text; commonMethods.SaveDocument(xml);
                        x++;
                    }
                }
                else if (ctr is ComboBox)
                {
                    if (((ComboBox)ctr).Text == attributes[x].Value) { x++; }
                    else
                    {
                        attributes[x].Value = ((ComboBox)ctr).Text; commonMethods.SaveDocument(xml);
                        x++;
                    }
                }
            }
        }
    }

它将更改保存回 xml 文件。我曾经在不使用 xmldoc.Save("sample.xml) 之类的 xmlwriter 的情况下保存它,但由于文件中的某些字符,我不得不使用不同的方法,例如。

    public XmlDocument SaveDocument(String x)
    {
        XmlDocument document = new XmlDocument();
        StreamWriter stream = new StreamWriter(x,false,Encoding.GetEncoding("iso-8859-7"));
        document.Save(xml);
        return (document);
    }

问题是当我编译它时说“xml被另一个进程使用”并且它失败了。

System.IO.IOException

【问题讨论】:

    标签: c# xml


    【解决方案1】:

    您遇到了这个异常,因为该文件仍由等待完成的 StreamReader 打开(垃圾收集)。 您应该始终处理您的流(和读取器/写入器)以尽快释放文件句柄。

    public XmlDocument LoadDocument(String path)
    {
        XmlDocument document = new XmlDocument();
        using (StreamReader stream = new StreamReader(path, Encoding.GetEncoding("iso-8859-7")))
        {
            document.Load(stream);
    
        }
        return (document);
    }
    
    
    public XmlDocument SaveDocument(XmlDocument document, String path)
    {
        using (StreamWriter stream = new StreamWriter(path,false,Encoding.GetEncoding("iso-8859-7")))
        {
            document.Save(stream);
        }
        return (document);
    }
    
    
    private void savebtn_Click(object sender, EventArgs e)
    {
        var doc = commonMethods.LoadDocument(xml);
        XmlNodeList attributes = doc.DocumentElement.SelectNodes("//Class[@Name='" + classname + "']/Property[@Id='" + id + "']/attribute::*");
        for (int x = 0; x < attributes.Count; )
        {
            foreach (Control ctr in table1.Controls)
            {
                if (ctr is TextBox)
                {
                    if (ctr.Text == attributes[x].Value.ToString()) { x++; }
                    else
                    {
                        attributes[x].Value = ctr.Text; commonMethods.SaveDocument(doc, xml);
                        x++;
                    }
                }
                else if (ctr is ComboBox)
                {
                    if (((ComboBox)ctr).Text == attributes[x].Value) { x++; }
                    else
                    {
                        attributes[x].Value = ((ComboBox)ctr).Text; commonMethods.SaveDocument(doc, xml);
                        x++;
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 现在它给了我错误:“文档没有根元素”行 document.Save(stream);我打开文件,它是空的
    • 可能是因为您的文档没有根元素 ;) 您必须在保存之前将元素添加到文档中。我编辑了我的答案...
    • 文档有内容。实际上内容丰富。
    • var doc = new Document(); doc.Save(...)不,没有内容
    • 基本上我想使用xmldocument加载和编写具有不同编码的xml文件。有不同的方法吗?
    【解决方案2】:

    您没有在加载文档后释放 StreamReader 对象

    添加using 语句:

    public XmlDocument LoadDocument(String x)
        {
            XmlDocument document = new XmlDocument();
            using (StreamReader stream = new StreamReader(xml, Encoding.GetEncoding("iso-8859-7")))
          {
            document.Load(stream);
    
          }
          return (document);
        }
    

    参考:http://msdn.microsoft.com/en-us/library/system.io.streamreader(v=vs.110).aspx

    【讨论】:

      猜你喜欢
      • 2017-10-23
      • 1970-01-01
      • 2012-02-09
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多