¿Cómo puedo generar XML válido en C#?¿Cómo puedo construir XML en C#?
Respuesta
Depende de la situación. XmlSerializer
es ciertamente una forma y tiene la ventaja de mapear directamente a un modelo de objetos. En .NET 3.5, XDocument
, etc. también son muy amigables. Si el tamaño es muy grande, entonces XmlWriter
es tu amigo.
Para una XDocument
ejemplo:
Console.WriteLine(
new XElement("Foo",
new XAttribute("Bar", "some & value"),
new XElement("Nested", "data")));
O lo mismo con 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);
Si usted está escribiendo un gran flujo de datos, a continuación, cualquiera de los DOM enfoques (como XmlDocument
/XDocument
, etc.) tomará rápidamente mucha memoria. Por lo tanto, si está escribiendo un archivo XML 100 MB desde CSV, puede considerar XmlWriter
; esto es más primitiva (una escritura única manguera de bomberos), pero muy eficiente (imaginar un lazo grande aquí):
XmlWriter writer = XmlWriter.Create(Console.Out);
writer.WriteStartElement("Foo");
writer.WriteAttributeString("Bar", "Some & value");
writer.WriteElementString("Nested", "data");
writer.WriteEndElement();
Por último, a través de 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);
Este es un buen modelo para el mapeo de clases, etc .; sin embargo, puede ser excesivo si está haciendo algo simple (o si el XML deseado realmente no tiene una correlación directa con el modelo del objeto). Otro problema con XmlSerializer
es que no le gusta serializar tipos inmutables: todo debe tener un getter público y setter (a menos que lo haga todo usted mismo al implementar IXmlSerializable
, en cuyo caso no ha ganado mucho usando XmlSerializer
) .
Me gustaría dar una oportunidad a XLINQ (léase: LINQ to XML). Es fácil, intuitivo y fácil de editar.
muestra: Reading and Writing XML using XLinq
Encontré este hallazgo realmente útil, gracias Chad.Aunque hay veces en que la serialización es la respuesta correcta, existen muchos escenarios en los que la generación correcta de código xml es la respuesta correcta. Es una pena que C# no tenga las mismas capacidades Xml en línea que VB.net. Gracias de nuevo. – Russell
Usar XElement of System.Xml.Linq para generar el xml es muy conveniente – Jemsworld
XmlWriter es la manera más rápida de escribir buen XML. XDocument, XMLDocument y algunos otros también funcionan bien, pero no están optimizados para escribir XML. Si desea escribir el XML lo más rápido posible, definitivamente debe usar XmlWriter.
Es decir, si desea que * la computadora * escriba el XML lo más rápido posible. Si usted, el desarrollador, desea crear XML de la forma más fácil y natural, ¡XmlWriter probablemente no sea la solución! – sjy
Para cosas simples, solo uso las clases XmlDocument/XmlNode/XmlAttribute y XmlDocument DOM encontrado en System.XML.
Genera el XML para mí, solo necesito vincular algunos elementos.
Sin embargo, en cosas más grandes, uso la serialización de XML.
También vea el XmlDocument fluent interface de Mark S. Rasmussen, que realmente proporciona una salida XML fácil de escribir/leer.
Para casos simples, también sugeriría mirar XmlOutput una interfaz fluida para construir Xml.
XmlOutput es ideal para la creación simple de Xml con código legible y fácil de mantener, al tiempo que genera Xml válido. El orginal post tiene algunos buenos ejemplos.
En el pasado he creado mi esquema XML, y luego he utilizado una herramienta para generar clases C# que se serializarán a ese esquema. La herramienta de definición de esquemas XML es un ejemplo
http://msdn.microsoft.com/en-us/library/x6c1kb0s(VS.71).aspx
Como arriba.
Uso stringbuilder.append().
Muy sencillo, y luego puede hacer xmldocument.load (objeto strinbuilder como parámetro).
Probablemente se encuentre usando string.concat dentro del parámetro append, pero este es un enfoque muy directo.
Excepto cuando olvida codificar algo correctamente y escribe Xml ilegal. –
Esta respuesta fue totalmente criticada, pero en base a esta pregunta eché un vistazo a una de mis propias implementaciones donde construyo XML. Para mi proyecto en particular, encontré consistentemente que construir mediante StringBuilder daba como resultado tiempos de procesamiento un 10% más rápidos que con XDocument/XmlWriter. Pero me siento cómodo con XML, y eso es para mi proyecto en particular. (Como referencia, los tamaños XML finales son de alrededor de 3,4 MB, con más de 8000 líneas). –
Me gustaría saber si midió el intercambio entre el rendimiento de la aplicación (¿estamos hablando de mejoras en milisegundos aquí?) Y el mantenimiento de la aplicación (haga su los ingenieros necesitan familiarizarse con el código durante una hora antes de hacer cambios ahora?) –
Lo mejor que he probado es LINQ to XSD (que es desconocido para la mayoría de los desarrolladores). Usted le otorga un Esquema XSD y genera un modelo de objeto perfectamente mapeado completo y completo (basado en LINQ a XML) para usted en segundo plano, que es realmente fácil de usar, y actualiza y valida su modelo de objeto y XML en tiempo real. Si bien sigue siendo "Vista previa", no he encontrado ningún error con él.
Si usted tiene un esquema XSD que tiene este aspecto:
<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>
Entonces sólo se puede construir XML como esto:
RootElement rootElement = new RootElement;
rootElement.Element1 = "Element1";
rootElement.Element2 = "Element2";
rootElement.Attribute1 = 5;
rootElement.Attribute2 = true;
O simplemente cargar un XML desde el archivo de esta manera:
RootElement rootElement = RootElement.Load(filePath);
O guárdalo de la siguiente manera:
rootElement.Save(string);
rootElement.Save(textWriter);
rootElement.Save(xmlWriter);
rootElement.Untyped
también produce el elemento en forma de elemento XElement (de LINQ a XML).
Tenga en cuenta que a partir de ahora, este proyecto parece estar a punto de morir. –
@Juegos: '[citation-needed]' –
@Robert Harvey: Compruebe la fecha de mi comentario. Tres días después, comenzaron los commit/fixes. Honestamente, me alegro de que el proyecto haya cambiado, ya que ahora puedo verlo como una opción factible. –
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)
)
);
Creo que este recurso debería ser suficiente para un ahorro/carga moderada de XML: Read/Write XML using C#.
Mi tarea era almacenar la notación musical. Elijo XML, porque supongo que .NET ha madurado lo suficiente como para permitir una solución fácil para la tarea. Yo estaba justo :)
Este es mi archivo de la canción prototipo:
<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>
que pueden resolverse con bastante facilidad:
Para Guardar en archivo:
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();
}
}
Para archivo de carga:
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);
}
}
}
}
}
- 1. ¿Cómo puedo construir un hash Perl en código C?
- 2. ¿Cómo construir un documento XML en Java de forma concisa?
- 3. ¿Cómo puedo construir py2exe sin errores?
- 4. Cómo construir exe en Visual Studio C++
- 5. ¿Cómo puedo convertir Xml a Json y viceversa en C#
- 6. ¿Cómo puedo construir WAR con Maven en Eclipse?
- 7. ¿Cómo construir una biblioteca estática Objective-C?
- 8. ¿Cómo puedo construir un Truth Table Generator?
- 9. ¿Cómo puedo procesar xml asincrónicamente en python?
- 10. ¿Cómo puedo descargar un archivo XML usando C#?
- 11. Cómo construir eficientemente un intérprete (lexer + analizador) en C?
- 12. ¿Cómo construir Boost con soporte C++ 0x?
- 13. Serialización XML en C#
- 14. Cómo obtener C# VSTO para construir en .NET framework 4.5
- 15. C# Construir notación hexadecimal cadena
- 16. ¿Cómo puedo fusionar archivos XML?
- 17. En scons, ¿cómo puedo inyectar un objetivo para construir?
- 18. ¿Cómo puedo construir un RPM en mi sistema MacOS?
- 19. ¿Cómo puedo construir una cadena json en javascript/jquery?
- 20. ¿Cómo puedo construir mis extensiones C con MinGW-w64 en Python?
- 21. ¿Cómo construir una lupa en WPF C# 4.0?
- 22. Xml Serialización en C#
- 23. Cómo construir un proyecto VS2010 C++ en un BuildServer
- 24. Cómo construir un motor de búsqueda en C#
- 25. ¿Cómo construiría este xml en C#
- 26. ¿Cómo leer el archivo XML en C#?
- 27. Cómo manejar null en xml y C#
- 28. Cómo incrustar xml en xml
- 29. ¿Agregar un documento xml a un nodo xml en C#?
- 30. ¿Cómo puedo autodefinir los nodos XML con XML :: LibXML?
No te olvides de XStreaming Elemento, http://msdn.microsoft.com/en-us/library/system.xml.linq.xstreamingelement.aspx. :) –
Para el ejemplo de XmlWriter, es importante tener en cuenta que debe cerrar el escritor al final para que funcione correctamente: writer.Close() es necesario después de writer.WriteEndElement(). – Marko