Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用XmlWriter追加现有XML文件_C#_Xml_Xmlreader_Xmlwriter - Fatal编程技术网

C# 使用XmlWriter追加现有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

我使用以下代码创建了一个XML文件:

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会将整个文件读入内存,这并不总是一个问题,但应该是已知的。