c# Создать XML документ на основе Xpath - PullRequest
0 голосов
/ 08 мая 2020

Мне нужно создать документ 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>

У меня есть Xpath элементов XML, поэтому я создал следующий класс

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>

Кто-нибудь может мне помочь?

1 Ответ

1 голос
/ 08 мая 2020

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

Это быстро становится очень утомительным и трудным в работе. Тем не менее, я надеюсь, что это ответ на ваш вопрос. В следующий раз, может быть, все требования изложить прямо в вопросе!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...