Jak zbudować XML w C#?
Jak mogę wygenerować poprawny XML w C#?
11 answers
To zależy od scenariusza. XmlSerializer
jest z pewnością jednym ze sposobów i ma tę zaletę, że mapuje bezpośrednio do modelu obiektowego. W. NET 3.5, XDocument
, itd. są również bardzo przyjazne. Jeśli rozmiar jest bardzo duży, to XmlWriter
jest twoim przyjacielem.
Dla XDocument
przykład:
Console.WriteLine(
new XElement("Foo",
new XAttribute("Bar", "some & value"),
new XElement("Nested", "data")));
Lub to samo z 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);
Jeśli piszesz duży strumień danych, to każdy z DOM podejść (takich jak XmlDocument
/XDocument
, itd.) szybko zajmie dużo pamięci. Więc jeśli piszesz 100 MB pliku XML z CSV , można rozważyć XmlWriter
; jest to bardziej prymitywne (zapis-raz firehose), ale bardzo wydajne (wyobraź sobie dużą pętlę tutaj):
XmlWriter writer = XmlWriter.Create(Console.Out);
writer.WriteStartElement("Foo");
writer.WriteAttributeString("Bar", "Some & value");
writer.WriteElementString("Nested", "data");
writer.WriteEndElement();
Wreszcie, 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);
Jest to ładny model mapowania do klas itp.; jednak może to być przesada, jeśli robisz coś prostego (lub jeśli pożądany XML nie ma bezpośredniej korelacji z modelem obiektowym). Innym problemem XmlSerializer
jest to, że nie lubi serializować typów niezmiennych : wszystko musi mieć publiczny getter i setter (chyba, że zrobisz to sam implementując IXmlSerializable
, w którym to przypadku nie zyskałeś zbyt wiele używając XmlSerializer
).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-06 08:37:59
Najlepszą rzeczą jaką wypróbowałem jest LINQ do XSD (co jest nieznane większości programistów). Podajesz mu schemat XSD i generuje on idealnie zmapowany kompletny, silnie wpisany model obiektowy (oparty na LINQ do XML) w tle, z którym jest naprawdę łatwo pracować - a także aktualizuje i waliduje twój model obiektowy i XML w czasie rzeczywistym. Chociaż nadal jest to "Podgląd", nie napotkałem żadnych błędów z nim.
Jeśli masz schemat XSD, który wygląda jak to:
<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>
Następnie możesz po prostu zbudować XML w następujący sposób:
RootElement rootElement = new RootElement;
rootElement.Element1 = "Element1";
rootElement.Element2 = "Element2";
rootElement.Attribute1 = 5;
rootElement.Attribute2 = true;
Lub po prostu załaduj plik XML w następujący sposób:
RootElement rootElement = RootElement.Load(filePath);
Lub zapisz to tak:
rootElement.Save(string);
rootElement.Save(textWriter);
rootElement.Save(xmlWriter);
rootElement.Untyped
zwraca również element w postaci XElement (od LINQ do XML).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-15 12:08:33
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)
)
);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-27 21:10:45
Dałbym XLINQ (Czytaj: LINQ to XML) spróbować. Jest łatwy, intuicyjny i łatwo można go edytować.
Przykład: Odczyt i zapis XML za pomocą XLinq
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-16 07:27:40
Sprawdź również XmlDocument fluent interface Marka S. Rasmussena, który naprawdę zapewnia łatwe do wpisania / odczytania wyjście XML.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-09 18:31:34
XmlWriter jest najszybszym sposobem na napisanie dobrego XML. XDocument, XMLDocument i niektóre inne działają dobrze, ale nie są zoptymalizowane do pisania XML. Jeśli chcesz napisać XML tak szybko, jak to możliwe, zdecydowanie powinieneś użyć XmlWriter.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-12 15:43:54
W przeszłości tworzyłem mój schemat XML, a następnie używałem narzędzia do generowania klas C#, które będą serializowały się do tego schematu. XML Schema Definition Tool jest jednym z przykładów
Http://msdn.microsoft.com/en-us/library/x6c1kb0s (VS. 71). aspx
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-12 15:49:16
Myślę, że ten zasób powinien wystarczyć do umiarkowanego zapisu/ładowania XML: odczytu/zapisu XML przy użyciu C#.
Moim zadaniem było przechowywanie notacji muzycznej. Wybieram XML, bo chyba . NET dojrzał na tyle, aby umożliwić łatwe rozwiązanie tego zadania. Miałem rację:)To jest mój prototyp pliku piosenki:
<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 można rozwiązać dość łatwo:
Dla zapisu do pliku:
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();
}
}
Dla wczytania pliku:
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);
}
}
}
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-27 21:06:11
Do prostych rzeczy używam klas XmlDocument/XmlNode/XmlAttribute i XmlDocument DOM znalezionych w systemie.XML.
Generuje XML dla mnie, muszę tylko połączyć kilka elementów razem.
Jednak przy większych rzeczach używam serializacji XML.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-12 15:44:29
W prostych przypadkach sugerowałbym również przyjrzenie się XmlOutput płynnemu interfejsowi do budowania Xml.
XmlOutput jest świetny do prostego tworzenia Xml z czytelnym i utrzymywalnym kodem, podczas generowania poprawnego Xml. Oryginalny post ma kilka świetnych przykładów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-12 15:48:51
Jak wyżej.
Używam stringbuilder.append ().
Bardzo proste, a następnie można zrobić xmldocument.load (obiekt strinbuilder jako parametr).
Prawdopodobnie znajdziesz się za pomocą string.concat w parametrze append, ale jest to bardzo proste podejście.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-12 21:05:32