Пользовательские имена тегов XML с использованием значения экземпляра в ASP.NET - PullRequest
0 голосов
/ 24 января 2020

Я работаю над этим ASP. NET Api, где данные получены через GET-запросы, прямо сейчас XML.

, все узлы xml генерируются с использованием кода. элементы (имена классов, имена свойств и т. д. c). Я могу, если я буду sh, использовать такие атрибуты, как [XmlType (TypeName = "DesiredName")], чтобы изменить эти имена узлов, но, тем не менее, это будет сопоставление 1-к-1 с именами, которые я использую в code.

У меня есть определенный c тип объекта, который я хотел бы отформатировать с использованием фактических значений времени выполнения, в отличие от символов времени компиляции.

Вот классы:

public class RootClass
{
    public string ID { get; set; }
    public List<Property> Properties { get; set; }
}

public class Property
{
    public string PropertyType { get; set; }
    // Other Fields
}

Допустим, у меня есть пара свойств, у которых есть свойстваTypes "Type1", "Type2", "Type3"

Мой желаемый Xml выглядит следующим образом:

<RootClass>
    <ID>23</ID>
    <Properties>
        <Type1>
            <Property>
                // Other Fields
            </Property>
            <Property>
                // Other Fields
            </Property>
        </Type1>
        <Type2>
            <Property>
                // Other Fields
            </Property>
        </Type2>
    </Properties>
</RootType>

Как видите, один из узлов будет назван в зависимости от значений, а не от схемы. Я легко могу выполнить группировку кода при отображении из модели в DTO, и у меня есть полный контроль над классами DTO, поэтому я могу изменить их по своему желанию, чтобы получить ожидаемые значения XML.

Во-первых, это вообще возможно?

Если это так, как должна выглядеть моя структура классов (и атрибуты) для достижения этого (Словари списков? Пользовательские коллекции?)

А если это не так , Какие еще варианты у меня есть, чтобы достичь чего-то максимально приближенного к этому?

1 Ответ

0 голосов
/ 25 января 2020

Попробуйте Xml Linq:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            RootClass root = new RootClass()
            {
                ID = "23",
                Properties = new List<Property>() {
                    new Property() { PropertyType = "Type1", Properties = new List<string>() { "A", "B", "C"} },
                    new Property() { PropertyType = "Type2", Properties = new List<string>() { "A", "B", "C"} }
                }
            };

            XElement rootClass = new XElement("RootClass", new object[] {
                new XElement("ID", root.ID),
                new XElement("Properties")
            });

            XElement properties = rootClass.Element("Properties");
            int count = 1;
            foreach (Property property in root.Properties)
            {
                XElement type = new XElement(property.PropertyType);
                properties.Add(type);
                foreach (string p in property.Properties)
                {
                    XElement strProperty = new XElement("Property", new object[] {
                        new XElement(p, count++)
                    });
                    type.Add(strProperty);
                }
            }

            rootClass.Save(FILENAME);
        }
    }
    public class RootClass
    {
        public string ID { get; set; }
        public List<Property> Properties { get; set; }
    }

    public class Property
    {
        public string PropertyType { get; set; }
        public List<string> Properties { get; set; }
    }
}
...