Я должен получить такой 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
?
XmlElement
, вы имеете в видуXmlSerializer
? (XmlElement
не стал бы этого делать;XmlSerializer
сделал бы) - person Marc Gravell   schedule 24.06.2014XmlElement
для этого; вы использовали для этогоXmlSerializer
и (отдельно) не удалось использовать для этогоXmlElement
... да? - person Marc Gravell   schedule 24.06.2014XElement
вы сами создаете xml, но с поддержкой форматирования; например: pastie.org/9319395 - person Marc Gravell   schedule 24.06.2014XmlSerializer
(который работает против объектной модели) не будет работать так, как вы хотите, вам нужно сделать что-то другое.XElement
— один из таких подходов.XmlDocument
это другое. Как иXmlWriter
(но более сложный). Но: работать напрямую с объектной моделью черезXmlSerializer
: нельзя. - person Marc Gravell   schedule 24.06.2014