使用c#编辑Xml的问题
本文关键字:问题 Xml 编辑 使用 | 更新日期: 2023-09-27 17:50:22
我之前发布了一个关于通过c#编辑xml文档的问题
c#写XML错误
然而,我现在又遇到麻烦了。我使用确切的代码,然后工作,但再次出现问题!
当我第一次点击按钮时,它似乎工作但是当我再次点击它时,我得到错误
Data at the root level is invalid. Line 83, position 10
当你打开XML文档时,由于某些原因字符""被添加到XML文档的开头,所以我得到
"<?xml version="1.0" encoding="UTF-8"?>"
我不明白为什么,这真的把我逼疯了。我敢肯定它以前是工作的。
我代码:path = test.xml
using (FileStream READER = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
System.Xml.XmlDocument Temp = new System.Xml.XmlDocument();
Temp.Load(READER);
using (FileStream WRITER = new FileStream(path, FileMode.Open, FileAccess.Write, FileShare.ReadWrite))
{
Temp.Save(WRITER);
}
}
UPDATE #2:
我按原样编译了你的样本,它对我来说工作得很好。我用直接从代码创建的文件和在Visual Studio中创建的xaml文件进行了测试。所以看起来你正在处理的文件已经损坏或有编码问题。
据我所知,你不能对损坏的文件做任何事情,但对于编码,你可以通过使用StreamReader对象在读取时指定它。您只需将所需的编码和阅读器流传递给StreamReader的构造函数。此外,它还有一个从字节顺序标记检测编码的选项。
using (TextReader txtreader = new StreamReader(new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), Encoding.GetEncoding(1251 /*desired codepage here*/)))
{
document.Load(txtreader);
}
或
using (TextReader txtreader = new StreamReader(new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), true /*tries to detect the encoding*/))
{
document.Load(txtreader);
}
当然,您应该使用相同的编码保存文件,否则下次运行加载代码时会出现问题。
我还附加了一个代码,创建一个文件,如果它不存在,或者只是修改它,如果它已经存在。
class Program
{
static readonly string path = @"C:'Users'Dmitry'Documents'test_3.xml";
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
test(path);
}
static void test(string path)
{
XmlDocument document = new XmlDocument();
if (File.Exists(path))
{
using (Stream readStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
document.Load(readStream);
}
}
else
{
document.AppendChild(document.CreateXmlDeclaration("1.0", "UTF-8", String.Empty));
document.AppendChild(document.CreateElement("Test"));
}
document.DocumentElement.AppendChild(document.CreateElement("Node"));
using (FileStream WRITER = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
{
document.Save(WRITER);
}
}
}