Построение XML в C # Windows или приложении ASP

Я передаю много параметров XML из своего приложения в SQL Server (как в Windows, так и в приложении ASP.Net)

Раньше я использовал для построения XML с помощью оператора конкатенации на основе строки, аналогичного приведенному ниже.

string XmlDetails = string.Empty;
XmlDetails = "<APPLICATION><SEND>";
XmlDetails += "<ID>" + txtCardNo.Text.ToString() + "</ID>";
XmlDetails += "</SEND></APPLICATION>";

Приложение действительно занимало память и работало очень медленно. Я меняю метод конкатенации на класс String Builder для создания большого XML.

 XmlDetails = string.Format("{0}<{1}>{2}</{1}>", "<APPLICATION><SEND>", "ID", txtCardNo.Text.ToString()); 
 XmlDetails = string.Format("{0}<{1}>{2}</{1}>{3}", XmlDetails, "PAYDET", txtPOSPaydet.Text.ToString(), "</SEND></APPLICATION>");

При использовании вышеупомянутого метода произошло резкое изменение уровней памяти, используемых моим приложением.

Я хотел бы знать, есть ли какие-нибудь лучшие методы, которые можно было бы использовать в моем приложении.


person Dilip    schedule 11.03.2015    source источник
comment
Также попробуйте использовать StringBuilder вместо конкатенации строк.   -  person Hari Prasad    schedule 11.03.2015
comment
Класс XElement может очень помочь   -  person ASh    schedule 11.03.2015
comment
@ASh Можешь дать мне образец?   -  person Dilip    schedule 11.03.2015
comment
@HariPrasad string.format - это подмножество класса построителя строк, верно? Есть ли между ними разница?   -  person Dilip    schedule 11.03.2015
comment
@Dilip, описание XElement + примеры: msdn.microsoft.com/en-gb/library/. мой ответ на другой вопрос по SO: stackoverflow.com/questions/28745459/   -  person ASh    schedule 11.03.2015
comment
String.Format в порядке, в дополнение к этому вы можете изменить код, например, sb.Append(string.Format("{0}<{1}>{2}</{1}>", "<APPLICATION><SEND>", "ID", txtCardNo.Text.ToString()));.   -  person Hari Prasad    schedule 11.03.2015
comment
String.Format в любом случае использует stringBuilder под капотом, поэтому производительность в этом случае не проблема.   -  person Yannick Meeus    schedule 11.03.2015


Ответы (2)


Вам доступны несколько вариантов:

XElement , который позволяет вам вручную создавать свой XML без необходимости создавать саму строку, а скорее так:

XElement xmlTree1 = new XElement("Root",
    new XElement("Child1", 1),
    new XElement("Child2", 2),
    new XElement("Child3", 3)
);

Console.WriteLine(xmlTree2);

Это напишет в консоль:

<Root>
  <Child1>1</Child1>
  <Child2>2</Child2>
  <Child3>3</Child3>
</Root>

Если ваш формат XML статический, вы также можете создать объект, представляющий ваши данные, пометить его как [Serializable], а затем сериализовать его:

public static void Main(string[] args)
{
    var myObjectToSerialize = new Root()
    {
        Child1 = 1,
        Child2 = 2,
        Child3 = 3
    };

    var serializer = new XmlSerializer(typeof(Root));
    serializer.Serialize(Console.Out, myObjectToSerialize);
    Console.ReadKey();
}

Со следующим классом:

[Serializable]
public class Root
{
    public int Child1 { get; set; }

    public int Child2 { get; set; }

    public int Child3 { get; set; }
}
person Yannick Meeus    schedule 11.03.2015
comment
Мой XML не статичен. Он построен с использованием различных элементов формы и других глобальных значений, которые могут измениться. Можно ли применять этот метод сериализатора в динамике также с наборами динамических переменных? - person Dilip; 11.03.2015
comment
Вы можете использовать анонимный тип, а затем указать это вперед. В нем подробно описан метод расширения, который должен помочь. Но если ваша структура XML изменится в зависимости от других факторов, я бы просто рекомендовал маршрут XDocument / XElement. - person Yannick Meeus; 11.03.2015
comment
Да, я думал о создании разных сериализуемых объектов для разных методов, которые мне нужны. Например, если я использую его для определенной таблицы, тогда создайте сериализатор XML для этой конкретной цели и используйте его. Но на самом деле есть ли какое-либо влияние на производительность при использовании любого из этих методов по сравнению с существующими, которые я использую? - person Dilip; 11.03.2015
comment
Лично, если приоритетом номер один является создание необработанного XML и отказ от защитного покрытия, которое обеспечивает запеченная в XML-сериализации, то вы можете придерживаться StringBuilder. Но я бы попробовал и то, и другое, измерил бы (производительность, память, работу). Если разница незначительна, я настоятельно рекомендую использовать собственные API. Они обеспечивают гораздо большую безопасность при работе с XML. - person Yannick Meeus; 11.03.2015
comment
есть ли какой-нибудь инструмент или процедуры, которые нужно использовать для сравнения двух методов? - person Dilip; 11.03.2015
comment
Не удалось найти большой разницы между методами String.Format и XElement. Во всяком случае, мне показалось, что метод XElement более правильный метод, и поэтому прибег к тому же самому. Спасибо @yannickmeeus - person Dilip; 14.03.2015

Почему бы не использовать класс XDocument.

var doc = new XDocument(
                    new XElement("APPLICATION",
                        new XElement("SEND",
                            new XElement("ID", txtCardNo.Text.ToString())
                            )
                        )
                    );
person Peter    schedule 11.03.2015
comment
какой из них будет наиболее эффективным с точки зрения памяти. - person Dilip; 11.03.2015
comment
Практически все будет более эффективным с точки зрения памяти по сравнению с конкатенацией базовых строк. - person Yannick Meeus; 11.03.2015
comment
Как уже упоминалось, конкатенация строк @YannickMeeus - дорогостоящая операция. XmlDocument или XDocument уже предоставляют API для эффективного управления XML для большинства сценариев. - person Peter; 11.03.2015