2010-02-17 15 views
8

Estoy analizando un archivo xml grande. Así que estoy usando un XmlReader en combinación con XElement en lugar de XElement.Load().Cómo eliminar espacios en blanco del objeto XElement creado a partir de XElement.ReadFrom (XmlReader)

He creado como objeto XElement de XmlReader como se muestra a continuación y here.

static IEnumerable<XElement> StreamRootChildDoc(string uri) 
{ 
    using (XmlReader reader = XmlReader.Create(uri, xmlReaderSettings)) 
    { 
     reader.MoveToContent(); 
     // Parse the file and display each of the nodes. 
     while (reader.Read()) 
     { 
      switch (reader.NodeType) 
      { 
       case XmlNodeType.Element: 
        if (reader.Name == "Child") 
        { 
         XElement el = XElement.ReadFrom(reader) as XElement; 
         if (el != null) 
          yield return el; 
        } 
        break; 
      } 
     } 
    } 
} 

que desea guardar este XElement contenido de objeto en la base de datos como una cadena sin espacios en blanco. Ninguna de las 3 formas siguientes funciona. Solo una nota, si cargo el xml en memoria usando XElement.Load(), el ToString (SaveOptions.DisableFormatting) funciona.

<root> <child></child> </root> //xml saved in db with whitespace 
<root><child></child></root> //want to save as this 

XElement.ToString(SaveOptions.DisableFormatting) // 
XElement.ToString(SaveOptions.None) 
XElement.ToString() 

Las XmlReaderSettings que estoy usando para el objeto XmlReader están debajo. Probé IgnoreWhitespace = verdadero/falso sin suerte, pero no puedo establecerlo como verdadero ya que algunos elementos se saltan (para obtener información sobre el salto, consulte Why does XmlReader skip every other element if there is no whitespace separator?).

XmlReaderSettings xmlReaderSettings = new XmlReaderSettings(); 
    xmlReaderSettings.ProhibitDtd = false; 
    //xmlReaderSettings.IgnoreWhitespace = true;//cannot use this setting 

Funciona si analizar el objeto XElement pero que en contra del propósito de utilizar XmlReader como XElement.Parse() carga el xml en la memoria.

XElement el = XElement.ReadFrom(reader) as XElement; 
XElement.Parse(el.ToString(), LoadOptions.None) 

¿Cómo puedo eliminar el espacio en blanco?

Editar: Esto es lo que tenía que hacer:

  1. La omisión de elementos se debe a dos lecturas reader.Read() y XElement.ReadFrom(reader) en la misma iteración omitiendo de esta manera todos los demás elementos. La solución del ciclo mencionado en el enlace de arriba lo resuelve. El problema no tiene nada que ver con XmlReaderSettings.
  2. xelement.ToString(SaveOptions.DisableFormatting) elimina el bonito formato.
+0

Creo que XmlReaderSettings.IgnoreWhitespace es el camino a seguir. ¿Qué elemento xml se omite cuando usa esta configuración? –

+0

Intenté con IgnoreWhitespace como verdadero y falso, pero sigo teniendo espacio en blanco. Quiero decir, con IgnoreWhitespace = true, algunos nodos se saltan, es decir, en lugar de recuperar 200 nodos secundarios, obtengo solo 100, no los he visto demasiado. Con IgnoreWhitespace = false, recupero los 200 nodos. Dado que funcionó con XElement.Load(), tiene que ver con XmlReader durante la llamada XmlReader.Create() e IgnoreWhitespace fue lo primero que probé. Me pregunto si hay otra configuración que deba configurar para el lector. – hIpPy

+0

¿Alguien? Me encontré con el mismo problema ... –

Respuesta

1

Pruebe usar this example de la clase XMLTextReader. XMLTextReader tiene un método "WhitespaceHandling", que puede establecer en none. Sería útil responder a esta pregunta, si pudieras haber proporcionado un archivo XML de prueba, probar si XMLTextReader funciona.

Cuestiones relacionadas