通过代码添加xml标记

问题描述:

我正在用C#编写应用程序。我已经有一个非空的.xml文件,我想向它添加新的值,而不删除现有的值。通过代码添加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(); 

我认为这个问题是该流没有按不知道在哪里提出新的价值。 更多信息:根元素已经输入。

使用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"); 

我这样做出来的内存,这样的方法的名称是aproximate。

正如另一种答案表示,采用XmlElement可以costy,因为它是在内存满载,当你调用Load()加载大的XML文件。

+0

这确实有帮助。非常感谢:) –

如果您的.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> 

当你写的XML文件这样一来,它总是会覆盖什么是文件之前。如果您想使用XmlTextWriter写入它,则必须先复制当前内容,然后将新元素写入适当的位置。不要忘记,您无法同时读取和写入同一个文件,因此您必须使用临时文件并使用它覆盖原始文件。或者你首先将整个文件读入一个字符串。或者先将结果写入字符串中。

但是更好的解决方案可能是使用XDocument(或XmlDocument)加载整个文档,修改并保存它。 (这样做是不是一个好主意,如果XML文件是巨大的。)

你有使用XmlTextWriter的原因吗?我发现LINQ to XML的选择更容易。

您的代码将如下所示;

XElement el = new XElement("Zapis"); 
el.Add(new XElement("Name",txtEnterName.Text)) 
el.Save(@"C:\\MyApp\\MySubDir\\Data\\" + pr + ".xml") 
+0

这写了.xml文件中的新元素,但删除了其他所有内容。 –

+0

如果你想加载什么使用var'existingEls = XElement.Load(filename)',然后使用'existingEls.Add()' – kmcc049