Jak mogę wygenerować prawidłowy kod XML w języku C #?
To zależy od scenariusza. XmlSerializer
jest z pewnością jednym ze sposobów i ma tę zaletę, że mapuje bezpośrednio na model obiektowy. W .NET 3.5 XDocument
itd. Są również bardzo przyjazne. Jeśli rozmiar jest bardzo duży, XmlWriter
to twój przyjaciel.
Na 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, każde podejście DOM (takie jak XmlDocument
/ XDocument
itp.) Szybko zajmie dużo pamięci. Więc jeśli piszesz plik XML 100 MB z CSV , możesz rozważyć XmlWriter
; jest to bardziej prymitywne (wężyk jednorazowy zapisu), 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 przez 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);
To dobry model do mapowania na klasy itp .; jednak może to być przesada, jeśli robisz coś prostego (lub jeśli pożądany kod XML tak naprawdę nie ma bezpośredniej korelacji z modelem obiektowym). Innym problemem XmlSerializer
jest to, że nie lubi serializować niezmiennych typów: wszystko musi mieć publiczny getter i setter (chyba że zrobisz to wszystko przez wdrożenie IXmlSerializable
, w którym to przypadku nie zyskałeś wiele za pomocą XmlSerializer
).
Najlepszą rzeczą, jaką wypróbowałem, jest LINQ do XSD (co jest nieznane większości programistów). Dajesz mu schemat XSD, który generuje doskonale odwzorowany kompletny model obiektowy o silnym typie (oparty na LINQ na XML) w tle, który jest naprawdę łatwy w obsłudze - i aktualizuje i weryfikuje twój model obiektowy i XML w czas rzeczywisty. Mimo że nadal jest to „Preview”, nie napotkałem żadnych błędów.
Jeśli masz schemat XSD, który wygląda następująco:
Następnie możesz po prostu zbudować XML w następujący sposób:
Lub po prostu załaduj XML z pliku w ten sposób:
Lub zapisz to w ten sposób:
rootElement.Untyped
zwraca również element w postaci XElement (od LINQ do XML).źródło
RootElement
źródło
XmlWriter to najszybszy sposób na napisanie dobrego XML. XDocument, XMLDocument i niektóre inne działają również dobrze, ale nie są zoptymalizowane do pisania XML. Jeśli chcesz napisać XML tak szybko, jak to możliwe, zdecydowanie powinieneś użyć XmlWriter.
źródło
W przeszłości tworzyłem mój schemat XML, a następnie korzystałem z narzędzia do generowania klas C #, które będą serializować do tego schematu. Narzędzie do definiowania schematów XML jest jednym przykładem
http://msdn.microsoft.com/en-us/library/x6c1kb0s(VS.71).aspx
źródło
Myślę, że ten zasób powinien wystarczyć do umiarkowanego zapisu / załadowania XML: odczyt / zapis XML przy użyciu C # .
Moim zadaniem było przechowywanie notacji muzycznej. Wybieram XML, ponieważ, jak sądzę, .NET jest wystarczająco dojrzały, aby umożliwić łatwe rozwiązanie zadania. Miałem rację :)
Oto prototyp mojego pliku piosenki:
Można to rozwiązać dość łatwo:
Aby zapisać do pliku:
Aby załadować plik:
źródło
Dla prostych rzeczy, po prostu używam klas XmlDocument / XmlNode / XmlAttribute i XmlDocument DOM znalezionych w System.XML.
Generuje dla mnie XML, muszę tylko połączyć kilka elementów razem.
Jednak w większych sprawach używam serializacji XML.
źródło
W prostych przypadkach sugerowałbym także spojrzenie na XmlOutput, płynny interfejs do budowania Xml.
XmlOutput doskonale nadaje się do prostego tworzenia Xml z czytelnym i łatwym do utrzymania kodem, jednocześnie generując prawidłowy Xml. Orginal poczta ma kilka świetnych przykładów.
źródło
Jak powyżej.
Używam stringbuilder.append ().
Bardzo proste, a następnie możesz wykonać xmldocument.load (obiekt strinbuilder jako parametr).
Prawdopodobnie znajdziesz się w pliku string.concat w parametrze append, ale jest to bardzo proste podejście.
źródło