我正在用C#编写一个应用程序。我已经是一个非空的.xml文件,我想为它添加新值,而不删除现有的值。
我试过这段代码:
首先:
FileStream docNewUser = new FileStream(@"C:\\MyApp\\MySubDir\\Data\\" + pr + ".xml", FileMode.Open);
XmlTextWriter xmlNewUser = new XmlTextWriter(docNewUser, null);
xmlNewUser.WriteStartDocument();
xmlNewUser.WriteStartElement("RootEl");//root
xmlNewUser.WriteStartElement("Zapis");
xmlNewUser.WriteStartElement("Name");
xmlNewUser.WriteString(txtEnterName.Text);
xmlNewUser.WriteEndElement();
xmlNewUser.WriteEndElement();//end of zapis
this.Close();
第二
FileStream docNewUser = new FileStream(@"C:\\MyApp\\MySubDir\\Data\\" + pr + ".xml", FileMode.Open);
XmlTextWriter xmlNewUser = new XmlTextWriter(docNewUser, null);
xmlNewUser.WriteStartDocument();
xmlNewUser.WriteStartElement("RootEl");//root-ot
xmlNewUser.WriteStartElement("Zapis");
xmlNewUser.WriteStartElement("Name");
xmlNewUser.WriteString(txtEnterName.Text);
xmlNewUser.WriteEndElement();
xmlNewUser.WriteEndElement();//end of zapis
xmlNewUser.WriteElementString("Ime", null, txtEnterName.Text);
this.Close();
第三
FileStream docNewUser = new FileStream(@"C:\\MyApp\\MySubDir\\Data\\" + pr + ".xml", FileMode.Open);
XmlTextWriter xmlNewUser = new XmlTextWriter(docNewUser, null);
xmlNewUser.WriteStartDocument();
xmlNewUser.WriteStartElement("Zapis");
xmlNewUser.WriteStartElement("Name");
xmlNewUser.WriteString(txtEnterName.Text);
xmlNewUser.WriteEndElement();
xmlNewUser.WriteEndElement();//end of zapis
xmlNewUser.WriteElementString("Ime", null, txtEnterName.Text);
this.Close();
我认为问题是流不知道将新值放在何处。 更多信息:已经输入了根元素。
答案 0 :(得分:1)
如果您的.NET版本支持它,请使用LINQ to XML。 (警告:我不是专家,而且可能有更优雅的方式来写这个。)
// Without error handling
var root = XElement.Load(@"C:\Users\TrueWill\Downloads\Foo.xml");
var product =
(from item in root.Elements("item")
where item.Element("name").Value == "Product1"
select item)
.Single();
product.Add(new XElement("size", "small"));
root.Save(@"C:\Users\TrueWill\Downloads\FooCopy.xml");
我的测试文件(之前):
<?xml version="1.0" encoding="utf-8"?>
<test>
<item><name>Product1</name></item>
<item><name>Product2</name></item>
</test>
我的测试文件副本(之后)(我复制而不是替换):
<?xml version="1.0" encoding="utf-8"?>
<test>
<item>
<name>Product1</name>
<size>small</size>
</item>
<item>
<name>Product2</name>
</item>
</test>
答案 1 :(得分:1)
当您以这种方式将XML写入文件时,它总是会覆盖之前文件中的内容。如果要使用XmlTextWriter
向其写入,则必须先复制当前内容,然后将新元素写入正确的位置。不要忘记您无法同时读取和写入同一文件,因此您必须使用临时文件并用它覆盖原始文件。或者您首先将整个文件读入字符串。或者先将结果写入字符串。
但更好的解决方案可能是使用XDocument
(或XmlDocument
)加载整个文档,修改它然后保存。 (如果XML文件很大,这样做不是一个好主意。)
答案 2 :(得分:0)
使用XmlDocument:
XmlDocument doc = new XmlDocument();
doc.Load("filepath");
XmlNode node = doc["MainNode"]["subnode1"]["subnode2"]; //to fetch the node after which you'd like to add something.
XmlElement stuffToAdd = doc.CreateNode("nodename");
stuffToAdd.InnerText = "the value of your added node";
node.AddChild(stuffToAdd);
doc.Save("filepath");
我这样做是因为内存不足,所以这些方法的名称都是近似的。
如另一个答案中所述,使用XmlElement
加载大型XML文件可能很费劲,因为当您调用Load()
时,它会在内存中完全加载。
答案 3 :(得分:0)
您是否有使用XmlTextWriter的原因?我发现LINQ to XML替代品更容易。
您的代码将如下所示;
XElement el = new XElement("Zapis");
el.Add(new XElement("Name",txtEnterName.Text))
el.Save(@"C:\\MyApp\\MySubDir\\Data\\" + pr + ".xml")