2010-02-17 54 views
8

我正在解析一個大的xml文件。所以我將XmlReader與XElement結合使用,而不是XElement.Load()。如何從XElement.ReadFrom(XmlReader)創建的XElement對象中刪除空格

我已經從XmlReader創建爲XElement對象,如下所示,並且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; 
      } 
     } 
    } 
} 

我要保存在數據庫中的字符串此的XElement對象的內容沒有空格。以下3種方式都不起作用。請注意,如果我使用XElement.Load()在內存中加載xml,則ToString(SaveOptions.DisableFormatting)將起作用。

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

我用於XmlReader對象的XmlReaderSettings如下。我嘗試了IgnoreWhitespace = true/false,但沒有運氣,但我無法將其設置爲true,因爲某些元素被跳過(原因在於跳過,請參閱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 

它的工作原理,如果我解析的XElement對象但這違背了使用的XmlReader作爲XElement.Parse的整個目的()加載XML在內存中。

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

如何刪除空白?

編輯:這是我必須做的:

  1. 元素跳躍在同一個迭代由於兩次讀取reader.Read()XElement.ReadFrom(reader)從而跳過所有其他元素。修復上面鏈接中提到的循環解決了這個問題。這個問題與​​無關。
  2. xelement.ToString(SaveOptions.DisableFormatting)刪除漂亮的格式。
+0

我會認爲XmlReaderSettings.IgnoreWhitespace是要走的路。使用此設置時,會跳過哪些xml元素? – 2010-02-17 02:29:01

+0

我試圖用IgnoreWhitespace作爲true和false,但我仍然得到空白。我的意思是,在IgnoreWhitespace = true的情況下,跳過了一些節點,即不是回收200個子節點,而是隻返回100個節點 - 我對此沒有太多的瞭解。使用IgnoreWhitespace = false我找回所有200個節點。 由於它與XElement.Load()一起工作,它在XmlReader.Create()調用期間與XmlReader有關,而IgnoreWhitespace是我嘗試的第一件事。想知道是否有另一個設置需要爲讀者設置。 – hIpPy 2010-02-17 16:09:40

+0

有人嗎?我剛碰到同樣的問題... – 2010-10-13 13:55:41

回答

1

嘗試使用this example構成XMLTextReader類。 XMLTextReader有一個「WhitespaceHandling」方法,您可以將它設置爲none。如果你可以提供一個測試XML文件來測試XMLTextReader是否有效,那麼回答這個問題將會很有幫助。