通过代码添加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文件。
如果您的.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")
这写了.xml文件中的新元素,但删除了其他所有内容。 –
如果你想加载什么使用var'existingEls = XElement.Load(filename)',然后使用'existingEls.Add()' – kmcc049
这确实有帮助。非常感谢:) –