Как использовать Xelement в этой ситуации

Я должен получить такой xml:

<ps>
    <pr>
        <name>name1</name>
        <comp>
            <type>CB</type>
            <attr>
                <value>0</value>
            </attr>
        </comp>
    </pr>
    <sep>sep1</sep>
    <pr>
        <name>name2</name>
        <comp>
            <type>RB</type>
            <attr>
                <value>1</value>
            </attr>
        </comp>
    </pr>
    <sep>sep2</sep>
    <pr>
        <name>name3</name>
        <comp>
            <type>CoM</type>
            <attr>
                <value>2</value>
            </attr>
        </comp>
    </pr>
    <sep>sep3</sep>
</ps>

Вы можете видеть, что у меня есть ps как родитель всего, и после этого у меня есть pr и sep в последовательности, и я хочу сохранить эту последовательность. Раньше я использовал для этого XmlElement, но он показывал все sep togetehr и все pr вместе. Я думаю, мне нужно использовать XElement для этого, но я не знаю, как их использовать. Может ли кто-нибудь объяснить мне или написать фрагмент кода, чтобы сделать ссылку, чтобы понять, что я получу этот вид xml.

Моя попытка сделать это: (что не дает того, что я хочу)

[XmlRoot(ElementName = "attr")]
public class Attr
{     
    [XmlElement("type")],
    public string Type { get; set; }

    [XmlElement("value")]
    public int Value { get; set; }

}

    [XmlRoot(ElementName = "pr")]
          public class Pr
        {
            [XmlElement("name")]
            public string Name { get; set; }

            [XmlElement("comp")]
            public List<Comp> Comp { get { return b3; } }
            private readonly List<Comp> b3 = new List<Comp>();

        }
 [XmlRoot(ElementName = "sep")]
    public class Sep
    {
        [XmlElement("sep")]
        public string Sep { get; set; }

    }

 public void Main()
{

            Ps pc = new Ps()
              {
                Pr = { new Pr { Name = "Name1",  Component = { new Comp { Type = "Type1", Attr = { new Attr { Type = "Com" } } } } }, { new Pr { Name = "Name2" ,Comp = { new Comp { Type = "Type2", Attr = { new Attr { Type = "Sl" ....And so On} } } } } } }
             ,
                Sep = { new Sep { Separators = "sep1" ..and so on} }  

              };
            var xml = pc.ToXml(); 
}

Но этот код не дает последовательности, как я хочу. Сначала он показывает в xml все sep togther, а затем ps togther (не последовательно). Я достиг этого с помощью XElement, но он статичен и не использует объекты моего класса, такие как «Имя», «Comp», «Type», «Value» и т. д. Это примерно так:

var el =   new XElement("ps",
                       new XElement("pr",
                           new XElement("name", "name1"),
                           new XElement("comp",
                               new XElement("type", "CB"),
                               new XElement("attr",
                                   new XElement("value", 0)
                               )
                           )
                       ),//And so on..

Так что это вовсе не использование объектов класса. Мы назначаем ей этот XElement("name", "name1"), но я хочу что-то вроде этого ps Object1 = new ps(); и Object1.pr[0].Name= "name1";

Как этого добиться и поддерживать ту же последовательность ps и sep?


person Sss    schedule 24.06.2014    source источник
comment
До того, как я использовал для этого XmlElement, вы имеете в виду XmlSerializer? (XmlElement не стал бы этого делать; XmlSerializer сделал бы)   -  person Marc Gravell    schedule 24.06.2014
comment
@MarcGravell Нет, я уже сделал это с помощью XmlSerializer. Он показывает все sep вместе и все pr вместе. Я хочу, чтобы они были последовательно, но я не смог сделать это с помощью XElement.   -  person Sss    schedule 24.06.2014
comment
Я попробовал это со второй частью кода, но курсор не входит в foreach (параметр var в pc.Pr) {здесь} в этом цикле, потому что в Pr ничего нет. Итак, как добиться этого с помощью XElement?   -  person Sss    schedule 24.06.2014
comment
точно... так что на самом деле вы не использовали XmlElement для этого; вы использовали для этого XmlSerializer и (отдельно) не удалось использовать для этого XmlElement... да?   -  person Marc Gravell    schedule 24.06.2014
comment
При использовании XElement вы сами создаете xml, но с поддержкой форматирования; например: pastie.org/9319395   -  person Marc Gravell    schedule 24.06.2014
comment
Да я вообще не правильно понимаю. ОК, я подробно объясню вам: до того, как у меня был xml, я создал объекты родительского класса в xml, и я получил доступ ко всем xml и сохранил их в объектах класса. Теперь я пытаюсь сделать наоборот. У меня есть объекты класса, и я должен создать xml из этого, и до того, как я использовал XmlElement, но он не поддерживает последовательность pr и sep. Вот почему я попросил тебя о помощи.   -  person Sss    schedule 24.06.2014
comment
@MarcGravell, но вы не использовали ни одного поля моих классов, таких как Type, name, Comp и attr и т. Д., В коде, который вы написали по ссылке (как я делал раньше, например, Pr = { new Pr { Name = Name1, Component = { new Comp { Type = Type1, Attr = { new Attr { Type = Com } } } } }). Я ТАКЖЕ ДОЛЖЕН ИСПОЛЬЗОВАТЬ ЭТИ ПОЛЯ (прошу прощения, если я называю это полем с неправильным именем). На самом деле я пытаюсь реализовать сериализацию.   -  person Sss    schedule 24.06.2014
comment
@MarcGravell, не используя XmlSerializer, вы имеете в виду не использовать в этой строке: XmlSerializer deserializer = new XmlSerializer(typeof(Ps)); ?   -  person Sss    schedule 24.06.2014
comment
@MarcGravell Я СНОВА ОБЪЯСНИЛ ВОПРОС С РЕДАКТИРОВАНИЕМ; ЧТОБЫ ВЫ ПОНЯЛИ, ЧТО Я ХОЧУ СДЕЛАТЬ.   -  person Sss    schedule 24.06.2014
comment
Я разместил это на вашем другом, худшем вопросе, и я думаю, что он все еще актуален, если вы приложите усилия, чтобы понять его. stackoverflow.com/questions/19049964/   -  person Austinh100    schedule 24.06.2014
comment
Вы везде повторяете одну и ту же ссылку. Пожалуйста, внимательно прочитайте вопрос. В ЧЕМ МОЯ ПРОБЛЕМА и ЧТО ГОВОРИТ МОЙ ВОПРОС. ссылка, которую вы прислали, не будет работать для меня (я уже сделал это, и если xml, полученный с помощью процедуры по вашей ссылке, не будет поддерживать последовательность ps и sep один за другим или будет как все ps вместе и все sep вместе . ПОЖАЛУЙСТА, ПРОЧИТАЙТЕ ВОПРОС ЕЩЕ РАЗ)   -  person Sss    schedule 24.06.2014
comment
@user234839 user234839 то, что вы хотите сделать, в значительной степени не имеет значения, когда вы сталкиваетесь с реальностью (если только вы не добровольно пишете библиотеку сериализации, которая устраняет разрыв между двумя вещами); если вы хотите использовать объектную модель, вы в основном выполняете сериализацию, и мы уже знаем, что это не дает желаемого результата. Итак: забудьте об этом. Вместо этого вам придется напрямую построить модель xml. У меня было где-то от 3 до 5 разговоров на одну и ту же тему, но в конечном итоге вам придется проделать всю работу здесь. Я не могу добровольно написать это для вас.   -  person Marc Gravell    schedule 24.06.2014
comment
@MarcGravell, извините, я не мог понять (вы пишете немного сложным языком). То есть вы имеете в виду, что нет альтернативы для достижения этой цели?   -  person Sss    schedule 24.06.2014
comment
@user234839 user234839 Я имею в виду, что, поскольку XmlSerializer (который работает против объектной модели) не будет работать так, как вы хотите, вам нужно сделать что-то другое. XElement — один из таких подходов. XmlDocument это другое. Как и XmlWriter (но более сложный). Но: работать напрямую с объектной моделью через XmlSerializer: нельзя.   -  person Marc Gravell    schedule 24.06.2014
comment
@MarcGravell Я попробовал xmlWriter, но делать это вручную слишком сложно, потому что мы делаем такие вещи: Writer.WriteElementString(Name, prs[0].Parameter[0].Name); . Как вы думаете, это возможно с помощью XmlChoiceIdentifierAttribute? (У меня нет опыта, поэтому я спросил вас один раз. Я все еще сильно застрял здесь с последних 2 недель).   -  person Sss    schedule 26.06.2014
comment
@ user234839 нет, я не думаю, что это подходящее решение; Я уже дал вам совет: создайте и разберите DOM. Я в общих чертах показал вам, как. Я не уверен, что вы здесь хотите, но опять же: я не просто напишу за вас все.   -  person Marc Gravell    schedule 26.06.2014
comment
Хорошо .. Я нашел для этого душу :)   -  person Sss    schedule 26.06.2014