#.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. Я в общих чертах показал вам, как это сделать. Я не уверен, чего вы здесь хотите, но опять же: я не собираюсь просто писать все это для вас.