it-swarm.dev

Jak mohu vytvořit XML v C #?

Jak mohu vygenerovat platný XML v C #?

427
Dan Esparza

Závisí to na scénáři. XmlSerializerje určitě jeden způsob a má výhodu mapování přímo na objektový model. V prostředí .NET 3.5 jsou XDocumentatd. Také velmi přátelští. Pokud je velikost velmi velká, pak XmlWriterje váš přítel.

Příklad XDocumentname__:

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

Nebo totéž s XmlDocumentname__:

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);

Pokud píšete velký tok dat, pak kterýkoli z přístupů DOM (například XmlDocumentname __/XDocumentatd.) Rychle zabere hodně Paměť. Takže pokud píšete 100 MB XML soubor z CSV , můžete zvážit XmlWritername__; toto je primitivnější (jednorázová firehose), ale velmi efektivní (představte si tu velkou smyčku):

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

Nakonec prostřednictvím XmlSerializername__:

[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);

Toto je pěkný model pro mapování do tříd atd .; však může být nadměrné, pokud děláte něco jednoduchého (nebo pokud požadované XML nemá ve skutečnosti přímou korelaci s objektovým modelem). Dalším problémem s XmlSerializerje to, že se mu nelíbí serializovat neměnné typy: všechno musí mít veřejný getter a setter (pokud to neuděláte sami implementací IXmlSerializablename__, v tom případě díky XmlSerializername__) jste toho moc nezískali.

496
Marc Gravell

Nejlepší věc, kterou jsem vyzkoušel, je LINQ na XSD (což je pro většinu vývojářů neznámé). Přidáte mu schéma XSD a vygeneruje pro vás na pozadí dokonale zmapovaný úplný silně zadaný objektový model (založený na LINQ na XML), s nímž je opravdu snadné pracovat - a aktualizuje a ověřuje váš objektový model a XML v reálný čas. I když je to stále „Náhled“, s tím jsem se nesetkal s žádnými chybami.

Pokud máte schéma XSD, které vypadá takto:

  <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>

Pak můžete jednoduše vytvořit XML takto:

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

Nebo jednoduše načtěte XML ze souboru, jako je tento:

RootElement rootElement = RootElement.Load(filePath);

Nebo jej uložte takto:

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

rootElement.Untyped také získá prvek ve formě XElement (od LINQ do XML).

59
user65199
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)
                         )
            );
23
Vincent

Vyzkoušel bych XLINQ (přečteno: LINQ do XML). Je to snadné, intuitivní a snadno upravitelné.

Ukázka: Čtení a zápis XML pomocí XLinq

21
Chad Moran

XmlWriter je nejrychlejší způsob, jak napsat dobrý XML. XDocument, XMLDocument a některé další fungují dobře, ale nejsou optimalizovány pro psaní XML. Pokud chcete psát XML co nejrychleji, měli byste rozhodně použít XmlWriter.

9

Podívejte se také na XmlDocument plynulé rozhraní Marka S. Rasmussena, který opravdu poskytuje snadný výstup/čtení XML výstupu.

9
Rob Walker

Myslím, že tento zdroj by měl stačit pro středně velké uložení/načtení XML: čtení/zápis XML pomocí C # .

Mým úkolem bylo ukládat hudební notaci. Vybírám si XML, protože myslím, že . NET je dostatečně vyzrálé, aby umožnilo snadné řešení úkolu. Měl jsem pravdu :)

Toto je můj prototyp souboru písně:

<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>

To lze vyřešit docela snadno:

Pro uložení do souboru:

 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();
     }

 }

Pro načtení souboru:

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);
            }
    }
}

}
}
3
swdev

V minulosti jsem vytvořil své schéma XML, poté jsem použil nástroj pro generování tříd C #, které budou serializovány do tohoto schématu. Nástroj pro definici schématu XML je jedním z příkladů

http://msdn.Microsoft.com/en-us/library/x6c1kb0s (VS.71) .aspx

3
Bob

Pro jednoduché věci používám pouze třídy XmlDocument/XmlNode/XmlAttribute a XmlDocument DOM nalezené v System.XML.

Vygeneruje pro mě XML, stačí jen propojit několik položek dohromady.

U větších věcí však používám serializaci XML.

1
FlySwat

Pro jednoduché případy bych také doporučil podívat se na XmlOutput plynulé rozhraní pro vytváření Xml.

XmlOutput je skvělý pro jednoduché vytváření Xml s čitelným a udržovatelným kódem, zatímco generuje platný Xml. původní příspěvek má několik skvělých příkladů.

1
Todd