C# 使用XmlWriter追加现有XML文件
我使用以下代码创建了一个XML文件:C# 使用XmlWriter追加现有XML文件,c#,xml,xmlreader,xmlwriter,C#,Xml,Xmlreader,Xmlwriter,我使用以下代码创建了一个XML文件: XmlWriterSettings xmlWriterSettings = new XmlWriterSettings(); xmlWriterSettings.Indent = true; xmlWriterSettings.NewLineOnAttributes = true; using (XmlWriter xmlWriter = XmlWriter.Create("Test.xml", xmlWriterSettings)) { xmlWri
XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
xmlWriterSettings.Indent = true;
xmlWriterSettings.NewLineOnAttributes = true;
using (XmlWriter xmlWriter = XmlWriter.Create("Test.xml", xmlWriterSettings))
{
xmlWriter.WriteStartDocument();
xmlWriter.WriteStartElement("School");
xmlWriter.WriteEndElement();
xmlWriter.WriteEndDocument();
xmlWriter.Close();
}
我需要动态插入节点以创建以下结构:
<?xml version="1.0" encoding="utf-8"?>
<School />
<Student>
<FirstName>David</FirstName>
<LastName>Smith</LastName>
</Student>
...
<Teacher>
<FirstName>David</FirstName>
<LastName>Smith</LastName>
</Teacher>
...
</School>
大卫
史密斯
...
大卫
史密斯
...
我怎么做?“FirstName”和“LastName”的值应该从键盘和可以随时输入,当然是在现有的下。您可以使用Linq Xml
XDocument doc = XDocument.Load(xmlFilePath);
XElement school = doc.Element("School");
school.Add(new XElement("Student",
new XElement("FirstName", "David"),
new XElement("LastName", "Smith")));
doc.Save(xmlFilePath);
编辑
如果要将元素添加到现有的
,只需在之前添加一个属性即可
school.add(new XElement("Student",
new XAttribute("ID", "ID_Value"),
new XElement("FirstName", "David"),
new XElement("LastName", "Smith")));
然后,您可以通过搜索->获取->添加将更多详细信息添加到现有的
XElement particularStudent = doc.Element("School").Elements("Student")
.Where(student => student.Attribute("ID").Value == "SearchID")
.FirstOrDefault();
if(particularStudent != null)
particularStudent.Add(new XElement("<NewElementName>","<Value>");
XElement SpecialStudent=doc.Element(“学校”).Element(“学生”)
.Where(student=>student.Attribute(“ID”).Value==“SearchID”)
.FirstOrDefault();
如果(特别是学生!=null)
添加(新的元素(“,”);
让我给你一个建议。当你创建xml文件时,给你的学生一个唯一的id,如下所示:
// to store the id variable, if you create more than one student you can increase it
count = 0;
xmlWriter.WriteStartElement("School");
xmlWriter.WriteAttributeString("ID",count.ToString());
xmlWriter.WriteEndElement();
int id = Convert.ToInt32(txtStudentId.Text);
XDocument xDoc = XDocument.Load("Test.xml");
XElement student = xDoc.Descendants("Student").Where(x => (string) x.Attribute("ID") == id).FirstOrDefault();
if (student != null)
{
string firstName = txtFirstName.Text;
string lastName = txtLastName.Text;
XElement first = new XElement("FirstName", firstName);
XElement last = new XElement("LastName", lastName);
student.Add(first);
student.Add(last);
xDoc.Save("Test.xml");
}
然后,当您需要向该学生添加信息时,您可以获得ID
、Firstname
和Lastname
,并且您可以使用LINQ to XML编辑XML文件,如下所示:
// to store the id variable, if you create more than one student you can increase it
count = 0;
xmlWriter.WriteStartElement("School");
xmlWriter.WriteAttributeString("ID",count.ToString());
xmlWriter.WriteEndElement();
int id = Convert.ToInt32(txtStudentId.Text);
XDocument xDoc = XDocument.Load("Test.xml");
XElement student = xDoc.Descendants("Student").Where(x => (string) x.Attribute("ID") == id).FirstOrDefault();
if (student != null)
{
string firstName = txtFirstName.Text;
string lastName = txtLastName.Text;
XElement first = new XElement("FirstName", firstName);
XElement last = new XElement("LastName", lastName);
student.Add(first);
student.Add(last);
xDoc.Save("Test.xml");
}
最后我成功了:)
如果(!File.Exists(“Test.xml”))
{
XmlWriterSettings XmlWriterSettings=新的XmlWriterSettings();
xmlWriterSettings.Indent=true;
xmlWriterSettings.NewLineOnAttributes=true;
使用(XmlWriter=XmlWriter.Create(“Test.xml”,xmlWriterSettings))
{
xmlWriter.WriteStartDocument();
xmlWriter.WriteStarteElement(“学校”);
xmlWriter.WriteStarteElement(“学生”);
WriteElementString(“FirstName”,FirstName);
WriteElementString(“LastName”,LastName);
xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();
xmlWriter.WriteEndDocument();
xmlWriter.Flush();
xmlWriter.Close();
}
}
其他的
{
XDocument XDocument=XDocument.Load(“Test.xml”);
XElement root=xDocument.Element(“学校”);
IEnumerable rows=root.substands(“学生”);
XElement firstRow=行。First();
firstRow.AddBeforeSelf(
新XElement(“学生”,
新XElement(“名字”,名字),
新XElement(“LastName”,LastName));
xDocument.Save(“Test.xml”);
}
下次我有一个建议:
string nameFile = "Test.xml";
bool newFile = false;
if (!File.Exists(nameFile))
{
newFile = true;
XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
xmlWriterSettings.Indent = true;
xmlWriterSettings.NewLineOnAttributes = true;
xmlWriter.WriteStartDocument();
xmlWriter.WriteStartElement("School");
xmlWriter = XmlWriter.Create("Test.xml", xmlWriterSettings))
}
else
{
doc = new XmlDocument();
doc.Load(nameFile);
// Create a XPathNavigator
// You can go where you want to add
// In this case it is just after last child of the roor
XPathNavigator navigator = doc.CreateNavigator();
navigator.MoveToChild("School", "");
xmlWriter = navigator.AppendChild();
}
// From here you can work only with xmlWriter,
// One will point on a file and the other on the stream of xmlDocument
// So you will need to save the document in the second choise
xmlWriter.WriteStartElement("Student");
xmlWriter.WriteElementString("FirstName", firstName);
xmlWriter.WriteElementString("LastName", lastName);
xmlWriter.WriteEndElement();
// End document / close or save.
if (newFile)
xmlWriter.WriteEndDocument();
xmlWriter.Close();
if (!newFile)
doc.Save(nameFile);
它应该有用。:) 我知道您要求使用XmlWriter,但我相信您可以通过使用XDocument使用更少的代码来实现这一点。以下是我的解决方案:
var filePath = "path/XmlFile.xml";
var xmlDoc = XDocument.Load(filePath);
var parentElement = new XElement("Student");
var firstNameElement = new XElement("FirstName", firstNameVariable);
var lastNameElement = new XElement("LastName", lastNameVariable);
parentElement.Add(firstNameElement);
parentElement.Add(lastNameElement);
var rootElement = xmlDoc.Element("School");
rootElement?.Add(parentElement);
xmlDoc.save();
这基于以下XML结构,并将附加在…
:
<School>
<Student>
<FirstName>John</FirstName>
<LastName>Johnson</LastName>
</Student>
...
</School>
约翰
约翰逊
...
希望这有帮助 大多数人会选择XmlDocument、XDocument或Serialization来完成类似的操作。选择XmlWriter有点奇怪。但是您创建新元素的代码。OP希望向现有元素添加新元素。每次我需要的时候我都想添加新元素。对不起,我很困惑。这是第一次使用XML。确实:)感谢您的帮助,如果您帮助我完成这一步骤,我将非常感激;)XDocument会将整个文件读入内存,这并不总是一个问题,但应该是已知的。