通过代码添加xml标记

时间:2011-08-27 15:33:57

标签: c# xml stream

我正在用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();

我认为问题是流不知道将新值放在何处。 更多信息:已经输入了根元素。

4 个答案:

答案 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")