Hoe kan ik XML bouwen in C#?

Hoe kan ik geldige XML genereren in C#?


Antwoord 1, autoriteit 100%

Het hangt af van het scenario. XmlSerializeris zeker een manier en heeft het voordeel dat het rechtstreeks aan een objectmodel kan worden toegewezen. In .NET 3.5 zijn XDocument, enz. ook erg vriendelijk. Als het formaat erg groot is, dan is XmlWriterje vriend.

Voor een XDocumentvoorbeeld:

Console.WriteLine(
    new XElement("Foo",
        new XAttribute("Bar", "some & value"),
        new XElement("Nested", "data")));

Of hetzelfde met XmlDocument:

XmlDocument doc = new XmlDocument();
XmlElement el = (XmlElement)doc.AppendChild(doc.CreateElement("Foo"));
el.SetAttribute("Bar", "some & value");
el.AppendChild(doc.CreateElement("Nested")).InnerText = "data";
Console.WriteLine(doc.OuterXml);

Als u een grotestroom aan gegevens schrijft, kan een van de DOM-benaderingen (zoals XmlDocument/XDocument, enz.) neemt al snel veel geheugen in beslag. Dus als u een XML-bestand van 100 MB schrijft vanuit CSV, kunt u overwegen XmlWriter; dit is primitiever (een eenmaal beschrijfbare brandslang), maar zeer efficiënt (stel je hier een grote lus voor):

XmlWriter writer = XmlWriter.Create(Console.Out);
writer.WriteStartElement("Foo");
writer.WriteAttributeString("Bar", "Some & value");
writer.WriteElementString("Nested", "data");
writer.WriteEndElement();

Eindelijk, via XmlSerializer:

[Serializable]
public class Foo
{
    [XmlAttribute]
    public string Bar { get; set; }
    public string Nested { get; set; }
}
...
Foo foo = new Foo
{
    Bar = "some & value",
    Nested = "data"
};
new XmlSerializer(typeof(Foo)).Serialize(Console.Out, foo);

Dit is een mooi model voor het toewijzen aan klassen, enz.; het kan echter overdreven zijn als u iets eenvoudigs doet (of als de gewenste XML niet echt een directe correlatie heeft met het objectmodel). Een ander probleem met XmlSerializeris dat het niet graag onveranderlijke typen serialiseert: alles moet een openbare getter ensetter hebben (tenzij je het allemaal zelf doet door IXmlSerializable, in dat geval heb je niet veel gewonnen met XmlSerializer).


Antwoord 2, autoriteit 12%

Het beste wat ik heb geprobeerd is LINQ to XSD(wat de meeste ontwikkelaars niet weten) . Je geeft het een XSD-schema en het genereert een perfect in kaart gebracht compleet sterk getypeerd objectmodel (gebaseerd op LINQ naar XML) voor je op de achtergrond, dat is heel gemakkelijk om mee te werken – en het actualiseert en valideert je objectmodel en XML in echte tijd. Hoewel het nog steeds “Preview” is, ben ik er geen bugs mee tegengekomen.

Als je een XSD-schema hebt dat er als volgt uitziet:

 <xs:element name="RootElement">
     <xs:complexType>
      <xs:sequence>
        <xs:element name="Element1" type="xs:string" />
        <xs:element name="Element2" type="xs:string" />
      </xs:sequence>
       <xs:attribute name="Attribute1" type="xs:integer" use="optional" />
       <xs:attribute name="Attribute2" type="xs:boolean" use="required" />
     </xs:complexType>
  </xs:element>

Dan kun je XML eenvoudig als volgt bouwen:

RootElement rootElement = new RootElement;
rootElement.Element1 = "Element1";
rootElement.Element2 = "Element2";
rootElement.Attribute1 = 5;
rootElement.Attribute2 = true;

Of laad eenvoudig een XML uit een bestand als volgt:

RootElement rootElement = RootElement.Load(filePath);

Of sla het op als volgt:

rootElement.Save(string);
rootElement.Save(textWriter);
rootElement.Save(xmlWriter);

rootElement.Untypedlevert het element ook op in de vorm van een XElement (van LINQ naar XML).


Antwoord 3, autoriteit 5%

new XElement("Foo",
       from s in nameValuePairList
       select
             new XElement("Bar",
                  new XAttribute("SomeAttr", "SomeAttrValue"),
                          new XElement("Name", s.Name),
                          new XElement("Value", s.Value)
                         )
            );

Antwoord 4, autoriteit 2%

XmlWriter is de snelste manier om goede XML te schrijven. XDocument, XMLDocument en enkele andere werken ook goed, maar zijn niet geoptimaliseerd voor het schrijven van XML. Als je de XML zo snel mogelijk wilt schrijven, moet je zeker XmlWriter gebruiken.


Antwoord 5

In het verleden heb ik mijn XML-schema gemaakt en vervolgens een tool gebruikt om C#-klassen te genereren die naar dat schema zullen worden geserialiseerd. De XML Schema Definition Tool is een voorbeeld

http://msdn.microsoft.com/ nl-nl/bibliotheek/x6c1kb0s(VS.71).aspx


Antwoord 6

Ik denk dat deze bron voldoende zou moeten zijn voor een matige XML-opslag/-lading: Read/ Schrijf XML met C#.

Mijn taak was om muzieknotatie op te slaan. Ik kies voor XML, omdat ik denk dat .NETvoldoende volwassen is geworden om een ​​gemakkelijke oplossing voor de taak mogelijk te maken. Ik had gelijk 🙂

Dit is het prototype van mijn songbestand:

<music judul="Kupu-Kupu yang Lucu" pengarang="Ibu Sud" tempo="120" birama="4/4" nadadasar="1=F" biramapembilang="4" biramapenyebut="4">
    <not angka="1" oktaf="0" naikturun="" nilai="1"/>
    <not angka="2" oktaf="0" naikturun="" nilai="0.5"/>
    <not angka="5" oktaf="1" naikturun="/" nilai="0.25"/>
    <not angka="2" oktaf="0" naikturun="\" nilai="0.125"/>
    <not angka="1" oktaf="0" naikturun="" nilai="0.0625"/>
</music>

Dat kan vrij eenvoudig worden opgelost:

Voor opslaan in bestand:

private void saveToolStripMenuItem_Click(object sender, EventArgs e)
 {
     saveFileDialog1.Title = "Save Song File";
     saveFileDialog1.Filter = "Song Files|*.xsong";
     if (saveFileDialog1.ShowDialog() == DialogResult.OK)
     {
         FileStream fs = new FileStream(saveFileDialog1.FileName, FileMode.Create);
         XmlTextWriter w = new XmlTextWriter(fs, Encoding.UTF8);
         w.WriteStartDocument();
         w.WriteStartElement("music");
         w.WriteAttributeString("judul", Program.music.getTitle());
         w.WriteAttributeString("pengarang", Program.music.getAuthor());
         w.WriteAttributeString("tempo", Program.music.getTempo()+"");
         w.WriteAttributeString("birama", Program.music.getBirama());
         w.WriteAttributeString("nadadasar", Program.music.getNadaDasar());
         w.WriteAttributeString("biramapembilang", Program.music.getBiramaPembilang()+"");
         w.WriteAttributeString("biramapenyebut", Program.music.getBiramaPenyebut()+"");
         for (int i = 0; i < listNotasi.Count; i++)
         {
             CNot not = listNotasi[i];
             w.WriteStartElement("not");
             w.WriteAttributeString("angka", not.getNot() + "");
             w.WriteAttributeString("oktaf", not.getOktaf() + "");
             String naikturun="";
             if(not.isTurunSetengah())naikturun="\\";
             else if(not.isNaikSetengah())naikturun="/";
             w.WriteAttributeString("naikturun",naikturun);
             w.WriteAttributeString("nilai", not.getNilaiNot()+"");
             w.WriteEndElement();
         }
         w.WriteEndElement();
         w.Flush();
         fs.Close();
     }
 }

Voor laadbestand:

openFileDialog1.Title = "Open Song File";
openFileDialog1.Filter = "Song Files|*.xsong";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
    FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open);
    XmlTextReader r = new XmlTextReader(fs);
    while (r.Read())
    {
        if (r.NodeType == XmlNodeType.Element)
        {
            if (r.Name.ToLower().Equals("music"))
            {
                Program.music = new CMusic(r.GetAttribute("judul"),
                    r.GetAttribute("pengarang"),
                    r.GetAttribute("birama"),
                    Convert.ToInt32(r.GetAttribute("tempo")),
                    r.GetAttribute("nadadasar"),
                    Convert.ToInt32(r.GetAttribute("biramapembilang")),
                    Convert.ToInt32(r.GetAttribute("biramapenyebut")));
            }
            else
                if (r.Name.ToLower().Equals("not"))
                {
                    CNot not = new CNot(Convert.ToInt32(r.GetAttribute("angka")), Convert.ToInt32(r.GetAttribute("oktaf")));
                    if (r.GetAttribute("naikturun").Equals("/"))
                    {
                        not.setNaikSetengah();
                    }
                    else if (r.GetAttribute("naikturun").Equals("\\"))
                    {
                        not.setTurunSetengah();
                    }
                    not.setNilaiNot(Convert.ToSingle(r.GetAttribute("nilai")));
                    listNotasi.Add(not);
                }
        }
        else
            if (r.NodeType == XmlNodeType.Text)
            {
                Console.WriteLine("\tVALUE: " + r.Value);
            }
    }
}
}
}

Antwoord 7

Voor simpele dingen gebruik ik gewoon de XmlDocument/XmlNode/XmlAttribute klassen en XmlDocument DOM gevonden in System.XML.

Het genereert de XML voor mij, ik hoef alleen maar een paar items aan elkaar te koppelen.

Voor grotere zaken gebruik ik echter XML-serialisatie.


Antwoord 8

Voor eenvoudige gevallen raad ik u aan te kijken naar XmlOutputeen vloeiende interface voor het bouwen van Xml.

XmlOutput is geweldig voor het eenvoudig maken van Xml met leesbare en onderhoudbare code, terwijl geldige Xml wordt gegenereerd. Het originele berichtbevat enkele geweldige voorbeelden.


Antwoord 9

Zoals hierboven.

Ik gebruik stringbuilder.append().

Zeer rechttoe rechtaan, en je kunt dan xmldocument.load(strinbuilder object als parameter) doen.

U zult waarschijnlijk merken dat u string.concat gebruikt binnen de append-parameter, maar dit is een zeer eenvoudige benadering.

Other episodes