recorrer parsear net modificar manipular leer lector elementos ejemplos con asp c# .net xml xml-parsing xmlreader

parsear - recorrer elementos de un xml c#



Cómo leer desde un XmlReader sin moverlo hacia adelante (5)

Hola chicos, tengo este escenario:

while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element && reader.Name == itemElementName) { XElement item = null; try { item = XElement.ReadFrom(reader) as XElement; } catch (XmlException ex) { //log line number and stuff from XmlException class } } }

En el ciclo anterior, estoy transformando un determinado nodo (itemElementName) en un elemento XElement.

Algunos nodos serán buenos XML e irán a un elemento XElement, sin embargo, algunos no lo harán.

En el CATCH, me gustaría no solo capturar las cosas estándar de XmlException ... También me gustaría capturar un extracto del Xml actual y una cadena.

Sin embargo, si realizo cualquier tipo de operación de LECTURA en el nodo antes de pasarlo a XElement, mueve el lector hacia adelante.

¿Cómo se puede obtener una "instantánea" de los contenidos del OuterXml del lector sin interferir con su posición?


No use ninguna operación de ''Lectura'' en el lector: como ha descubierto, esto lo hace avanzar. Use llamadas a propiedades como reader.HasValue y reader.Value para inspeccionar los contenidos. Busque ''XmlReader'' en el navegador de objetos, hay bastantes propiedades que puede leer.

Editar: no creo que haya una forma sencilla de obtener el XML, posiblemente porque el nodo actual puede no ser un XML válido por sí mismo, como un nodo XmlWhiteSpace, XmlText o incluso un XmlAttribute.


En realidad, ReadSubtree devolverá un lector que "envuelve" al lector original. Entonces, al leer el nuevo, también avanzará el original. Debe considerar XmlReader como un lector de solo reenvío, simplemente no puede regresar. En cuanto a su escenario, en lugar de intentar recordar parte del XML, puede pedirle al lector la posición en el archivo de entrada. Simplemente transfiéralo a la interfaz IXmlLineInfo, tiene métodos para devolver la línea y la posición. Usando esto, podría recordar alguna posición inicial (antes del elemento en cuestión) y luego la posición final del error. Y luego lea esa parte del archivo intput como texto sin formato.



Otra idea: lea el XML externo (que avanza el lector), luego cree un nuevo lector a partir de este XML que le permite "regresar" y procesar los elementos del nodo actual.

while (r.ReadToFollowing("ParentNode")) { parentXml = r.ReadOuterXml(); //since ReadOuterXml() advances the reader to the next parent node, create a new reader to read the remaining elements of the current parent XmlReader r2 = XmlReader.Create(new StringReader(parentXml)); r2.ReadToFollowing("ChildNode"); childValue = r2.ReadElementContentAsString(); r2.Close(); }


Lo que hice fue leer solo el elemento en un XmlDocument y leerlo en su lugar. En mi caso, tuve que convertir un documento de flujo a HTML. Tuve que leer un elemento interno para asignar un "estilo" al elemento HTML principal.