XmlDocument读取XML流后保存的问题

jinder 2009-06-22 04:14:40

原来的XML文档内容为:




<?xml version="1.0" encoding="utf-8"?>
<书店>
<嘻嘻></嘻嘻>
</书店>



执行一下代码:




using (FileStream fs = new FileStream(Path, FileMode.Open, FileAccess.ReadWrite))
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(fs);
XmlNode root = xmlDoc.SelectSingleNode("书店");
XmlElement xe1 = xmlDoc.CreateElement("哈哈");
root.AppendChild(xe1);
xmlDoc.Save(fs);
}



保存结果如下:




<?xml version="1.0" encoding="utf-8"?>
<书店>
<嘻嘻></嘻嘻>
</书店><?xml version="1.0" encoding="utf-8"?>
<书店>
<嘻嘻></嘻嘻>
<哈哈></哈哈>
</书店>


=======================================================================

看起来是没有把原来的内容覆盖掉,而只是追加到了后面,请问为什么,还有如何操作才能使其达到替换的保持效果呢?谢谢


...全文
643 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinder 2009-06-27
  • 打赏
  • 举报
回复
无动静了,算了,结贴吧.
jinder 2009-06-26
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 wfg2004 的回复:]
用CDATE格式的XML文件来解决
[/Quote]

看不懂...说详细点行吗?
wfg2004 2009-06-26
  • 打赏
  • 举报
回复
用CDATE格式的XML文件来解决
jinder 2009-06-24
  • 打赏
  • 举报
回复

现在问题是:
既然说"你创建的那FileStream 是追加的.那肯定是在后面追加一份啊",那怎么创建出不是追加的FileStream 呢?
liqngjun123 2009-06-24
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 jinder 的回复:]
引用 10 楼 devilplus 的回复:
fs.SetLength(fs.Position);




C# code
using (FileStream fs = new FileStream(Path, FileMode.Open, FileAccess.ReadWrite))
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(fs);
XmlNode root = xmlDoc.SelectSingleNode("书店");
XmlElement xe1 = xmlDoc.CreateElement("哈哈");
root.AppendChild(xe1);
fs.SetLength(0);
xml…
[/Quote]牛
redleafe 2009-06-24
  • 打赏
  • 举报
回复
学习了,关注。
jinder 2009-06-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 devilplus 的回复:]
using (FileStream fs = new FileStream(Path, FileMode.Open, FileAccess.ReadWrite))
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(fs);
XmlNode root = xmlDoc.SelectSingleNode("书店");
XmlElement xe1 = xmlDoc.CreateElement("哈哈");
root.AppendChild(xe1);
fs.Seek(0, SeekOrigin.Begin)//将文件指针移到起始位置
xmlDoc.Save(fs);
fs.SetLength(fs.Position);
[/Quote]

这倒是一个方法,能达到效果,只是用起来心里会怪怪的,编程的人相信都会有这感觉吧,呵呵.
jinder 2009-06-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 birdlonger 的回复:]
你的问题是,你创建的那FileStream 是追加的.那肯定是在后面追加一份啊.

不过感觉不用那么麻烦吧
XmlDocument doc = new XmlDocument ();
doc.Load(path); //path -- Xml路径
root = doc.DocumentElement ;
XmlElement xe1 = doc.CreateElement("哈哈");
root.AppendChild(xe1);
doc.Save(path);

不也能达到你的效果吗
[/Quote]


你这方法我知道,不过我的原文件是经过字节加密的.
所以需要先读取解密一下后再进行XML操作,操作之后又要进行加密后再保存.
所以需要以流得方式进行读取,不能直接用路径.

你说"你创建的那FileStream 是追加的.那肯定是在后面追加一份啊",那怎么创建出不是追加的FileStream 呢?
birdlonger 2009-06-23
  • 打赏
  • 举报
回复
你的问题是,你创建的那FileStream 是追加的.那肯定是在后面追加一份啊.

不过感觉不用那么麻烦吧
XmlDocument doc = new XmlDocument ();
doc.Load(path); //path -- Xml路径
root = doc.DocumentElement ;
XmlElement xe1 = doc.CreateElement("哈哈");
root.AppendChild(xe1);
doc.Save(path);

不也能达到你的效果吗

jinder 2009-06-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 devilplus 的回复:]
fs.SetLength(fs.Position);
[/Quote]


using (FileStream fs = new FileStream(Path, FileMode.Open, FileAccess.ReadWrite))
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(fs);
XmlNode root = xmlDoc.SelectSingleNode("书店");
XmlElement xe1 = xmlDoc.CreateElement("哈哈");
root.AppendChild(xe1);
fs.SetLength(0);
xmlDoc.Save(fs);
}

根据你的代码修改如上,这样能实现
devilplus 2009-06-22
  • 打赏
  • 举报
回复
using (FileStream fs = new FileStream(Path, FileMode.Open, FileAccess.ReadWrite))
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(fs);
XmlNode root = xmlDoc.SelectSingleNode("书店");
XmlElement xe1 = xmlDoc.CreateElement("哈哈");
root.AppendChild(xe1);
fs.Seek(0, SeekOrigin.Begin)//将文件指针移到起始位置
xmlDoc.Save(fs);
fs.SetLength(fs.Position);
}
Comer 2009-06-22
  • 打赏
  • 举报
回复
跟踪调试下,看运行期值,然后根据 差别修改
jinder 2009-06-22
  • 打赏
  • 举报
回复

3楼4楼的方法都是分两步进行,打开>读取>关掉>修改/添加/删除>再打开>写入>关掉,这样确实可以实现.
不过有没办法做到一步就行了呢?就是打开>读取>修改/添加/删除>写人>关掉



using (FileStream fs = new FileStream(Path, FileMode.Open, FileAccess.ReadWrite))
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(fs);
XmlNode root = xmlDoc.SelectSingleNode("书店");
XmlElement xe1 = xmlDoc.CreateElement("哈哈");
root.AppendChild(xe1);
fs.Seek(0, SeekOrigin.Begin)//将文件指针移到起始位置
xmlDoc.Save(fs);
}


上边的代码比原先增加了句[fs.Seek(0, SeekOrigin.Begin)//将文件指针移到起始位置]
多了这个后,如果是修改后内容比原来多的话就没问题,如果是比原来少的话那原文件最后的一些数据就会有残留了.
我在想,有没有办法在保存之前先将fs里的数据先清除,然后再保存呢,这样也许就行得通了.
代码如下:



using (FileStream fs = new FileStream(Path, FileMode.Open, FileAccess.ReadWrite))
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(fs);
XmlNode root = xmlDoc.SelectSingleNode("书店");
XmlElement xe1 = xmlDoc.CreateElement("哈哈");
root.AppendChild(xe1);
fs.清空()//将文件内容清空
xmlDoc.Save(fs);
}



只为了代码简洁点,多问了几句,呵呵,讨论一下.
jinder 2009-06-22
  • 打赏
  • 举报
回复
Quote=引用 6 楼 springfeng2008 的回复:]
不知道楼主是要全覆盖还是只覆盖单个节点
[/Quote]


想要的效果就是操作后文件变为:(简单说就是平常的修改文件后保存)[

<?xml version="1.0" encoding="utf-8"?>
<书店>
<嘻嘻></嘻嘻>
<哈哈></哈哈>
</书店>
掌握未来2019 2009-06-22
  • 打赏
  • 举报
回复
不知道楼主是要全覆盖还是只覆盖单个节点
成都慢生活 2009-06-22
  • 打赏
  • 举报
回复
<?xml version="1.0" encoding="utf-8"?>
<A>
<b></b>
</A>



XmlDocument xmlDoc = new XmlDocument();
using (FileStream fs = new FileStream(@"a.xml", FileMode.Open, FileAccess.Read))
{
xmlDoc.Load(fs);
fs.Close();
}

using (FileStream fs = new FileStream(@"a.xml", FileMode.Open, FileAccess.Write))
{
XmlNode root = xmlDoc.SelectSingleNode("A");
XmlElement xe1 = xmlDoc.CreateElement("c");
root.AppendChild(xe1);
xmlDoc.Save(fs);
}


<?xml version="1.0" encoding="utf-8"?>
<A>
<b>
</b>
<c />
</A>
shang123guan 2009-06-22
  • 打赏
  • 举报
回复
好久没做编程了。我记得是这个样子的,你只是创建了一个新节点。
如果要把旧的节点去掉,你要执行xmlDoc.clear(),大概如此
zgke 2009-06-22
  • 打赏
  • 举报
回复
using (FileStream fs = new FileStream(@"C:\1.txt", FileMode.Open, FileAccess.ReadWrite))
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(fs);
fs.Close();
XmlNode root = xmlDoc.SelectSingleNode("书店");
XmlElement xe1 = xmlDoc.CreateElement("哈哈");
root.AppendChild(xe1);

FileStream _SaveFileStream = new FileStream(@"C:\1.txt", FileMode.Open, FileAccess.Write);
xmlDoc.Save(_SaveFileStream); //fs为打开方式而且 可以读写。。那写一定是追加.
_SaveFileStream.Close();
}

这样把.
成都慢生活 2009-06-22
  • 打赏
  • 举报
回复
You make a mistake for stream
zgke 2009-06-22
  • 打赏
  • 举报
回复

using (FileStream fs = new FileStream(@"C:\1.txt", FileMode.Open, FileAccess.ReadWrite))
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(fs);

XmlNode root = xmlDoc.SelectSingleNode("书店");
XmlElement xe1 = xmlDoc.CreateElement("哈哈");
root.AppendChild(xe1);


xmlDoc.Save(fs); //fs为打开方式而且 可以读写。。那写一定是追加.
}




重新建立一个FileStream对象.用于保存数据.

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧