2010-02-17 29 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是否有效,那么回答这个问题将会很有帮助。