c#基于Xpath生成XML文档
我需要创建如下XML文档:c#基于Xpath生成XML文档,c#,xml,xpath,C#,Xml,Xpath,我需要创建如下XML文档: <Root> <Data> <Name>Name1</Name> <Surname>Surname1</Surname> <Gender>M</Gender> </Data> <Data> <Name>Name2</Name> <Surname>Surname2&
<Root>
<Data>
<Name>Name1</Name>
<Surname>Surname1</Surname>
<Gender>M</Gender>
</Data>
<Data>
<Name>Name2</Name>
<Surname>Surname2</Surname>
<Gender>F</Gender>
</Data>
</Root>
然后是下面的方法
public static void CreateXml()
{
List<XpathFieldValue> fieldValues = new List<XpathFieldValue> {
new XpathFieldValue{ Xpath="/Root/Data/Name", Value="Name1" },
new XpathFieldValue{ Xpath="/Root/Data/Surname", Value="Surname1" },
new XpathFieldValue{ Xpath="/Root/Data/Gender", Value="M"},
new XpathFieldValue{ Xpath="/Root/Data/Name", Value="Name2" },
new XpathFieldValue{ Xpath="/Root/Data/Surname", Value="Surname2" },
new XpathFieldValue{ Xpath="/Root/Data/Gender", Value="F"}
};
XmlDocument document = new XmlDocument();
document.LoadXml("<Root/>");
foreach (XpathFieldValue fieldValue in fieldValues)
{
Set(document, fieldValue.Xpath, fieldValue.Value);
}
document.Save(@"C:\Temp\xmlDocOut.xml");
}
publicstaticvoidcreatexml()
{
列表字段值=新列表{
新的XpathFieldValue{Xpath=“/Root/Data/Name”,Value=“Name1”},
新的XpathFieldValue{Xpath=“/Root/Data/姓氏”,Value=“姓氏1”},
新的XpathFieldValue{Xpath=“/Root/Data/Gender”,Value=“M”},
新的XpathFieldValue{Xpath=“/Root/Data/Name”,Value=“Name2”},
新的XpathFieldValue{Xpath=“/Root/Data/姓氏”,Value=“姓氏2”},
新XpathFieldValue{Xpath=“/Root/Data/Gender”,Value=“F”}
};
XmlDocument document=新的XmlDocument();
document.LoadXml(“”);
foreach(字段值中的XpathFieldValue字段值)
{
Set(document,fieldValue.Xpath,fieldValue.Value);
}
保存(@“C:\Temp\xmlDocOut.xml”);
}
我从这里复制了Set方法:
但当我运行它时,它只创建XML的最后一部分
<Root>
<Data>
<Name>Name2</Name>
<Surname>Surname2</Surname>
<Gender>F</Gender>
</Data>
</Root>
姓名2
姓2
F
有人能帮我吗?XPath实际上不是用来生成文档的,而是用来访问它们的 另一种(可能更好)方法是序列化它。 但是,由于这个问题要求xml字段是可变的,所以序列化不是一种可行的方法。我强烈建议您更改此要求,您将在以下示例中看到原因:
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
using (var writer = new System.IO.StreamWriter(@"C:\Users\luigi.trabacchin\Desktop\asd.xml"))
{
var doc = new System.Xml.XmlDocument();
var root = doc.CreateElement("Root");
doc.AppendChild(root);
for (var i = 0; i <= 1; i++)
{
var dataNode = doc.CreateElement("Data");
root.AppendChild(dataNode);
{
var node = doc.CreateElement("Name");
dataNode.AppendChild(node);
var text = doc.CreateTextNode($"Name {i}");
node.AppendChild(text);
}
{
var node = doc.CreateElement("Surname");
dataNode.AppendChild(node);
var text = doc.CreateTextNode($"Surname {i}");
node.AppendChild(text);
}
{
var node = doc.CreateElement("Gender");
dataNode.AppendChild(node);
var text = doc.CreateTextNode(i %2 == 0 ? "M" : "F");
node.AppendChild(text);
}
}
doc.Save(writer);
}
Console.WriteLine("Hello World!");
}
}
}
使用系统;
名称空间控制台EAPP1
{
班级计划
{
静态void Main(字符串[]参数)
{
使用(var writer=new System.IO.StreamWriter(@“C:\Users\luigi.trabacchin\Desktop\asd.xml”))
{
var doc=new System.Xml.XmlDocument();
var root=doc.CreateElement(“根”);
doc.AppendChild(根);
对于(var i=0;我可以,但如果我添加索引,xml结果将为Name1 Name1 M Name2 Name2 F,并且我不需要节点中的索引……我担心这不是一个好方法,为什么需要xpath呢?创建一个serialzie类不是更容易吗?我无法创建一个类,因为元素名我创建的输出xml可以每月更改,并且使用该程序的用户可以更改元素名称哦,我明白了,设计很糟糕,所以xD我会再回答一次,然后我的回答对你有用吗?你解决了吗?我正试着根据我的情况调整它
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
using (var writer = new System.IO.StreamWriter(@"C:\Users\luigi.trabacchin\Desktop\asd.xml"))
{
var doc = new System.Xml.XmlDocument();
var root = doc.CreateElement("Root");
doc.AppendChild(root);
for (var i = 0; i <= 1; i++)
{
var dataNode = doc.CreateElement("Data");
root.AppendChild(dataNode);
{
var node = doc.CreateElement("Name");
dataNode.AppendChild(node);
var text = doc.CreateTextNode($"Name {i}");
node.AppendChild(text);
}
{
var node = doc.CreateElement("Surname");
dataNode.AppendChild(node);
var text = doc.CreateTextNode($"Surname {i}");
node.AppendChild(text);
}
{
var node = doc.CreateElement("Gender");
dataNode.AppendChild(node);
var text = doc.CreateTextNode(i %2 == 0 ? "M" : "F");
node.AppendChild(text);
}
}
doc.Save(writer);
}
Console.WriteLine("Hello World!");
}
}
}