我在这里要做的是查看元素是否存在于xml文档中,如果它确实存在,那么我想修改它的内部文本。如果它不存在我想创建它并为它创建适当的内部文本。然而,当它确实存在一个元素时,我试图将它的内部文本更改为比整个xml文件写入更短的内容。
我的代码:
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(path);
XmlNodeList felement = xmldoc.GetElementsByTagName(Element);
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
if (felement.Count == 0)
{
XmlElement elmRoot = xmldoc.DocumentElement;
XmlElement xmlele = xmldoc.CreateElement(Element);
xmlele.AppendChild(xmldoc.CreateTextNode(data));
elmRoot.AppendChild(xmlele);
xmldoc.Save(fs);
}
else
{
felement[0].InnerText = data;
xmldoc.Save(fs);
}
fs.Close();
使用较短的内部文本修改之前的XML文件:
<?xml version="1.0" encoding="utf-8"?>
<MyXMLFile>
<Source>C:\Users\Dacto\Desktop\</Source>
<Destination>C:\Program Files\Adobe</Destination>
</MyXMLFile>
更短的内部文字后:
<?xml version="1.0" encoding="utf-8"?>
<MyXMLFile>
<Source>C:\Users\Dacto\Desktop\Napster</Source>
<Destination>C:\Users</Destination>
</MyXMLFile>/MyXMLFile>
参见“extra”/ MyXMLFile&gt;发生了什么事?
答案 0 :(得分:2)
由于输出不是有效的XML,因此XmlDocument.Save不太可能生成文件的全部内容。鉴于此,我怀疑在创建FileStream时你应该提供一个不同的参数而不是FileMode.Open - FileMode.Create将确保文件在被写入之前被截断 - 当前它被覆盖,留下旧的内容到位如果新文件不够大,无法覆盖它。
答案 1 :(得分:0)
问题在于他们写出文件的方式,而不是xml。如果你尝试类似的东西,
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
byte[] info = new UTF8Encoding(true).GetBytes("AAAAA");
fs.Write(info, 0, info.Length);
您应该看到:
AAAAA version="1.0" encoding="utf-8"?>
<MyXMLFile>
<Source>C:\Users\Dacto\Desktop\</Source>
<Destination>C:\Program Files\Adobe</Destination>
</MyXMLFile>
而不是FileMode.Open,您需要FileMode.Create,以便在您写入文件之前将其截断(如果文件已存在)。
答案 2 :(得分:0)
您必须保存XmlDocument的另一个选项是使用XmlWriter而不是FileStream。
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(path);
XmlNodeList felement = xmldoc.GetElementsByTagName(Element);
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
using (XmlWriter wr = XmlWriter.Create(path), settings))
{
if (felement.Count == 0)
{
XmlElement elmRoot = xmldoc.DocumentElement;
XmlElement xmlele = xmldoc.CreateElement(Element);
xmlele.AppendChild(xmldoc.CreateTextNode(data));
elmRoot.AppendChild(xmlele);
xmldoc.Save(wr);
}
else
{
felement[0].InnerText = data;
xmldoc.Save(wr);
}
}
另外,如果你继续使用原始的FileStream方法,那么我建议将它包装在一个using语句中,就像我上面用XmlWriter做的那样,如果你这样做,那么你可以去掉fs.Close()语句