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

#.net #xml #xml-serialization #xelement #xml-deserialization

#.net #xml #xml-сериализация #xelement #xml-десериализация

Вопрос:

Я должен получить такой 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 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 вместе, а затем ps вместе (не последовательно)
Я достиг этого с помощью XElement, но он статичен и не использует объекты моего класса, такие как «Name», «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..
  

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

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

Комментарии:

1. «До того, как я использовал XmlElement для этого» — вы имеете в виду XmlSerializer ? ( XmlElement не сделал бы этого; XmlSerializer бы)

2. @MarcGravell Нет, я уже сделал это с помощью XmlSerializer. Он показывает все sep вместе и все pr вместе. Я хочу, чтобы они были последовательно, но я не мог найти, нужно ли это делать с помощью XElement.

3. Я попробовал это со второй частью кода, но курсор не вводит foreach (var param в pc.Pr ) {here } в этом цикле, потому что Pr ничего не имеет внутри. Итак, как этого добиться с помощью XElement?

4. @user234839 то, что вы хотите сделать, в значительной степени не имеет значения, когда сталкиваешься с реальностью (если только ты не вызываешься написать библиотеку сериализации, которая устраняет разрыв между двумя вещами); если вы хотите использовать объектную модель, вы в основном выполняете сериализацию — и мы уже знаем, что это не приводит к достижениювывод, который вы хотите. Итак: забудьте об этом. Вместо этого вам придется создавать XML-модель напрямую. У меня было где-то от 3 до 5 разговоров на одну и ту же тему, но в конечном итоге вам придется поработать здесь. Я не могу добровольно написать это для вас.

5. @user234839 нет, я не думаю, что это подходящее решение; Я уже дал вам свой совет: создайте и проанализируйте DOM. Я в общих чертах показал вам, как это сделать. Я не уверен, чего вы здесь хотите, но опять же: я не собираюсь просто писать все это для вас.