2010-02-17 9 views
8

Sto analizzando un file xml di grandi dimensioni. Quindi sto usando un XmlReader in combinazione con XElement invece di XElement.Load().Come rimuovere lo spazio bianco dall'oggetto XElement creato da XElement.ReadFrom (XmlReader)

Ho creato come oggetto XElement da XmlReader come mostrato di seguito e 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; 
      } 
     } 
    } 
} 

Desidero salvare questo contenuto di oggetto XElement nel database come stringa senza spazi bianchi. Nessuno dei tre modi seguenti funziona. Solo una nota, se carico l'xml in memoria usando XElement.Load(), il ToString (SaveOptions.DisableFormatting) funziona.

<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() 

Le impostazioni XmlReader che sto utilizzando per l'oggetto XmlReader sono riportate di seguito. Ho provato IgnoreWhitespace = true/false senza fortuna, ma non posso impostarlo come vero, dato che alcuni elementi sono saltati (per motivi di omissione, vedi 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 

Funziona se analizzare l'oggetto XElement ma che sconfigge l'intero scopo di utilizzare XmlReader come XElement.Parse() carica il codice XML in memoria.

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

Come posso rimuovere la spazio bianco?

Edit: Questo è quello che dovevo fare:

  1. Gli elementi salto è dovuto a due letture reader.Read() e XElement.ReadFrom(reader) nella stessa iterazione di saltare in tal modo ogni altro elemento. Risolvere il ciclo menzionato nel link sopra risolve quello. Il problema non ha nulla a che fare con XmlReaderSettings.
  2. xelement.ToString(SaveOptions.DisableFormatting) rimuove la bella formattazione.
+0

Penso che XmlReaderSettings.IgnoreWhitespace sia la strada da percorrere. Quale elemento xml viene saltato quando si utilizza questa impostazione? –

+0

Ho provato con IgnoreWhitespace come vero e falso ma ottengo ancora spazi bianchi. Intendevo che, con IgnoreWhitespace = true, alcuni nodi venissero saltati, invece di recuperare 200 nodi figlio, tornerei solo a 100 - Non ho dato molta importanza a questo. Con IgnoreWhitespace = false torno tutti i 200 nodi. Poiché ha funzionato con XElement.Load(), ha a che fare con XmlReader durante la chiamata XmlReader.Create() e IgnoreWhitespace è stata la prima cosa che ho provato. Mi chiedo se c'è un'altra impostazione che ho bisogno di impostare per il lettore. – hIpPy

+0

Qualcuno? Ho appena avuto lo stesso problema ... –

risposta

1

Provare a utilizzare this example della classe XMLTextReader. Il XMLTextReader ha un metodo "WhitespaceHandling", che puoi impostare su none. Sarebbe utile rispondere a questa domanda, se fosse possibile fornire un file XML di test, per testare funziona XMLTextReader.

Problemi correlati