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#基于Xpath生成XML文档_C#_Xml_Xpath - Fatal编程技术网

c#基于Xpath生成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&

我需要创建如下XML文档:

<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!");
        }
    }
}