我正在解析一个大型的xml文件。因此,我将XmlReader与XElement结合使用,而不是XElement.Load()。

我已经从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)

如何删除空白?

编辑:这是我要做的:
  • 元素跳过是由于在同一迭代中两次读取reader.Read()XElement.ReadFrom(reader),从而跳过了其他所有元素。修复上面链接中提到的循环可以解决该问题。这个问题与XmlReaderSettings无关。
  • xelement.ToString(SaveOptions.DisableFormatting)删除漂亮的格式。
  • 最佳答案

    尝试使用XMLTextReader类的this example。 XMLTextReader具有方法“WhitespaceHandling”,您可以将其设置为无。如果您可以提供一个测试XML文件,以测试XMLTextReader的工作原理,那么回答这个问题将是很有帮助的。

    关于whitespace - 如何从XElement.ReadFrom(XmlReader)创建的XElement对象中删除空格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2277791/

    10-15 13:54