8

我正在解析一个大的 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;
            }
        }
    }
}

我想将此 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)在同一次迭代中,因此跳过了所有其他元素。修复上面链接中提到的循环可以解决这个问题。这个问题与XmlReaderSettings.
  2. xelement.ToString(SaveOptions.DisableFormatting)删除漂亮的格式。
4

1 回答 1

1

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

于 2011-09-30T23:08:39.877 回答