2010-05-20 25 views
5

Me gustaría crear un cuadro de texto que cargue archivos xml y permita a los usuarios editarlos. Sin embargo, no puedo usar XmlDocument para cargar, ya que los archivos pueden ser muy grandes. Estoy buscando opciones para transmitir/cargar el documento xml en fragmentos para que no me salgan los errores de memoria, al mismo tiempo, el rendimiento también es importante. ¿Podrías decirme cuáles serían las buenas opciones?Editar archivos xml de gran tamaño

Respuesta

-2

Probablemente esté buscando XmlTextReader.

+0

XmlTextReader proporciona sólo avance acceso de sólo lectura - ¿verdad? Necesito proporcionar la capacidad de editar el xml y guardarlo en el archivo. Debería poder cargar trozos en el cuadro de texto mientras el usuario se desplaza: corrígeme si mi enfoque es incorrecto. ¡Gracias! – Matt

+0

-1: XmlTextReader está en desuso. use 'XmlReader.Create' en su lugar. –

2

¡Pruebe Scintilla.NET, es millas mejor que un TextBox!

http://scintillanet.codeplex.com/

Carga del documento es fácil:

using (TextReader reader = new StreamReader(myFilePath, Encoding.UTF8)) 
{ 
    scintillaDocument.Text = reader.ReadToEnd(); 
} 

O:

scintillaDocument.Text = File.ReadAllText(myFilePath); 
+0

yay! alguien deshizo el -1 en mi publicación ... – code4life

+0

No fui yo quien -1 sino lector. Read to End() no funcionaría con algunos archivos XML muy grandes. No estoy familiarizado con Scintillanet, pero ¿hay alguna manera de no cargar todo el documento en la memoria? – kenny

+0

@kenny: hmm ... supongo que necesitaría un XmlTextReader y cargar segmentos de XML en el control. Para permitir que el usuario edite el texto del documento, tendrá que escribir un código adicional para leer en el texto hacia atrás y hacia adelante. Veré si puedo publicar algo. – code4life

1

también he tenido que hacer frente a grandes archivos XML (1+) y tenía un concierto para analizar los elementos a importar a una base de datos mySql. Tuve éxito al usar un lector de flujo de texto. Lo que hice fue seguir leyendo en trozos hasta que tuviera un "registro" única completa de un xml basado en el conocido

`<perRecordTag>` 

    <other data/node elements> 

`</perRecordTag>` 

Entonces, me gustaría hacer un XmlDocument para leer de la cadena (después de que el anterior y posterior del registro) despojado. Luego podría analizar, revisar, cualquiera que sea ese registro único y seguir adelante.

Obviamente, tenía que mantener todo lo que después del final de registro XML para iniciar el comienzo del siguiente elemento de registro leído, pero eso no fue un problema.

1

He tenido problemas similares haciendo este tipo de cosas con los datos de archivo CSV.

Drapp es correcto, es probable que la forma más limpia de abordar la situación suponiendo que el usuario no está esperando para leer todo a nivel de la raíz de un golpe.

En teoría todo lo que hay que tener cuidado de lo que es abierto o cerrado, sino que puede almacenar esta información solo núcleo en una cadena y que no debe ser demasiado voluminoso.

y como sugiere Drapp sólo tiene que cargar los datos a un arroyo y con un poco de gestión de posiciones cuidado que debe ser capaz de leer y escribir.

Su mayor problema es que si en el punto x desea reemplazar los datos en el nodo y con algunos datos de diferente longitud, terminaría con un espacio en el archivo o sobrescribiría el siguiente nodo/a porción de ella.

por lo que cada vez que se hace un cambio, es necesario transmitir el archivo a otro archivo hasta el punto en que se inicia la edición, luego transmitir en la edición y transmitir en el resto del archivo.

Usted debe ser capaz de hacer todo esto con el lector corriente y corriente escritor objetos que se encuentran encima de 1 instancia de secuencia en el archivo original más un escritor corriente en un segundo archivo temporal.

nunca va a ser rápido, sin embargo, el mero hecho de escribir cambios a un archivo 1.x concierto lleva un tiempo en el disco duro y sin optimización se va a cambiar eso.

+0

Bien dicho ... Y como ha notado, un archivo de salida paralela se usaría como el Flujo de Escritura ... Lea lo que sea, permita que el usuario lo tenga, luego escriba los resultados nuevamente en el segundo archivo. Trabaja en el siguiente registro de cualquier base para la edición. – DRapp

1

Puede usar archivos mapeados en memoria para manejar archivos de gran tamaño.Ver MemoryMappedFile Class en MSDN. OK, es de bajo nivel, pero puede ayudar. Disponible desde .NET 4.

Puede usar lectores con soporte XMLNameTable. Se habilitar cadena de internados, por lo que si una cadena aparece con frecuencia en un documento, la misma cadena lo representará en la memoria para usted.

También puedes probar un analizador XML de terceros. P.ej. Altova XML se usa en los productos de la compañía, por lo que quizás pueda hacer más cosas que las clases incorporadas de .NET. Por cierto, es gratis.

+0

Muy interesante. – ScottE

2

¿Por qué molestarse con leer el xml en un documento xml si todo lo que hace es presionarlo en un cuadro de texto?

¿De qué tamaño está hablando aquí? ¿Has intentado transmitirlo a un cuadro de texto todavía?

sometextarea.Text = System.IO.File.ReadAllText(Server.MapPath("somexml.xml")); 

Ahora, el ahorro de vuelta al sistema de archivos es una historia diferente, especialmente si usted quiere que sea 1. XML válido y 2. Válido contra un esquema.

+0

Una cosa que ScottE puede estar implicando (o debería estar implicando) es que quizás no puedas obtener todo el archivo en un cuadro de texto sin importar lo que hagas. –

0

Creo que estás tratando de hacer demasiado en tu cuadro de texto aquí. ¿Por qué no hacer que los usuarios editen el documento XML en una herramienta destinada a editar XML? Tal herramienta podría incluso ser capaz de manejar archivos XML grandes.

Luego, cuando el XML ha sido editado, los usuarios pueden cargar el documento XML completo en su sitio.

Cuestiones relacionadas