如何从XElement.ReadFrom(XmlReader)创建的XElement对象中删除空格

hIp*_*pPy 8 xelement whitespace xmlreader

我正在解析一个大的xml文件.所以我使用XmlReader结合XElement而不是XElement.Load().

我已经从XmlReader中的XElement对象创建的,如下所示,并在这里.

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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想将此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()
Run Code Online (Sandbox Code Playgroud)

我用于XmlReader对象的XmlReaderSettings如下所示.我尝试IgnoreWhitespace = true/false没有运气,但我不能将其设置为true,因为跳过一些元素(为了跳过原因,请参阅为什么XmlReader在没有空格分隔符的情况下跳过所有其他元素?).

    XmlReaderSettings xmlReaderSettings = new XmlReaderSettings();
    xmlReaderSettings.ProhibitDtd = false;
    //xmlReaderSettings.IgnoreWhitespace = true;//cannot use this setting
Run Code Online (Sandbox Code Playgroud)

如果我解析XElement对象,但是因为XElement.Parse()将xml加载到内存中,那么它就失败了使用XmlReader的全部目的.

XElement el = XElement.ReadFrom(reader) as XElement;
XElement.Parse(el.ToString(), LoadOptions.None)
Run Code Online (Sandbox Code Playgroud)

如何删除空格?

编辑:这是我必须做的:

  1. 跳过元素是由于两次读取reader.Read()XElement.ReadFrom(reader)在同一次迭代中,因此跳过每个其他元素.修复上面链接中提到的循环解决了这个问题.这个问题与此无关XmlReaderSettings.
  2. xelement.ToString(SaveOptions.DisableFormatting) 删除漂亮的格式.

aly*_*lid 1

尝试使用XMLTextReader 类的示例。XMLTextReader 有一个方法“WhitespaceHandling”,您可以将其设置为 none。如果您可以提供一个测试 XML 文件来测试 XMLTextReader 是否有效,那么回答这个问题将会很有帮助。