2010-02-17 21 views
8

Büyük bir xml dosyası ayrışıyorum. Bu yüzden XElement.Load() yerine XElement ile birlikte bir XmlReader kullanıyorum.XElement nesnesinden oluşturulan XElement nesnesinden boşluk nasıl kaldırılır XElement.ReadFrom (XmlReader)

XmlReader'dan XElement nesnesini aşağıda gösterildiği gibi ve here olarak oluşturdum.

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; 
      } 
     } 
    } 
} 

Bu XElement nesne içeriğini veritabanında boşluk olmadan dize olarak kaydetmek istiyorum. Aşağıdaki 3 yoldan hiçbiri işe yaramaz. Sadece bir not, XElement.Load() kullanarak bellekteki xml yüklerseniz, ToString (SaveOptions.DisableFormatting) çalışır.

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

Ben XmlReader nesne için kullanıyorum XmlReaderSettings altındadır. IgnoreWhitespace = true/false'i şanssız olarak denedim ancak bazı öğeler atlandığından doğru olarak ayarlayamıyorum (atlama nedeni için Why does XmlReader skip every other element if there is no whitespace separator?'a bakın).

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

Ben XElement nesnesini ayrıştırmak eğer çalışır ama bu XElement.Parse olarak XmlReader kullanarak tüm amacı (yendi) bellekte xml yükler.

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

Boşluğu nasıl kaldırabilirim?

Düzenleme:

  1. elemanları atlama iki böylelikle her eleman atlama aynı tekrarında reader.Read() ve XElement.ReadFrom(reader) okur nedeniyle şudur: Bu yapmak zorunda budur. Yukarıdaki bağlantıda sözü edilen döngü sabitlendiğinde bunu çözer. Sorun, XmlReaderSettings ile ilgisi yok.
  2. xelement.ToString(SaveOptions.DisableFormatting) güzel biçimlendirmeyi kaldırır.
+0

XmlReaderSettings.IgnoreWhitespace'in gitmenin yolu olduğunu düşünüyorum. Bu ayarı kullandığınızda hangi xml öğesi atlanır? –

+0

IgnoreWhitespace ile doğru ve yanlış olarak denedim ancak yine de boşluk alıyorum. Yani, IgnoreWhitespace = true ile bazı düğümler atlandı, yani 200 çocuk düğümünü geri almak yerine sadece 100'e geri dönüyorum - buna fazla bakmadım. IgnoreWhitespace = false ile 200 düğümün hepsini geri alırım. o XElement.Load() ile çalıştı yana , bu XmlReader.Create() arama sırasında XmlReader ile ilgisi var ve ignoreWhitespace Denedim ilk şeydi. Okuyucu için ayarlamam gereken başka bir ayar var mı diye merak ediyorum. – hIpPy

+0

Kimse? Sadece aynı problemle karşılaştım ... –

cevap

1

XMLTextReader sınıfını this example kullanmayı deneyin. XMLTextReader, hiçbirine ayarlayabileceğiniz bir "WhitespaceHandling" yöntemine sahiptir. XMLTextReader'ın çalışıp çalışmadığını test etmek için bir test XML dosyası vermiş olsaydınız, bu soruyu cevaplamak yararlı olurdu.