【问题标题】:c# Generate XML document based on Xpathc# 基于Xpath生成XML文档
【发布时间】:2020-08-23 21:09:30
【问题描述】:

我需要像这样创建一个 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>

我有 XML 元素的 Xpath,所以我创建了以下类

class XpathFieldValue
{
    public string Xpath { get; set; }
    public string Value { get; set; }
}

然后是下面的方法

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

我从这里复制了 Set 方法:link

但是当我运行它时,它只会创建 XML 的最后一部分

<Root>
  <Data>
    <Name>Name2</Name>
    <Surname>Surname2</Surname>
    <Gender>F</Gender>
  </Data>
</Root>

谁能帮帮我?

【问题讨论】:

  • 我的回答对你有用吗?你以某种方式解决了吗?
  • 我正在尝试根据我的情况调整它

标签: c# xml xpath


【解决方案1】:

XPath 并不是真正用于生成文档,而是用于访问 em。

另一种(可能更好)的方法是序列化它。 但是,由于问题要求 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!");
        }
    }
}

很快就会变得非常乏味且难以处理。 我仍然希望这能回答你的问题。 下一次,也许直接在问题中说明所有要求!

【讨论】:

  • 好的,但是如果我添加索引,xml 结果将是 Name1Surname1MName2Surname2F 我不需要索引节点
  • 嗯...我担心这不是一个好方法,你为什么需要 xpath 呢?为serialzie创建一个类不是更容易吗?
  • 我无法创建一个类,因为我创建的元素名称和输出 xml 可以逐月更改,并且使用该程序的用户可以更改元素名称
  • 哦,我明白了,糟糕的设计,所以 xD 我会再回答一次
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 2017-10-16
  • 2018-10-11
  • 2019-11-09
  • 2020-05-25
相关资源
最近更新 更多