【问题标题】:How to remove whitespace from XElement object created from XElement.ReadFrom(XmlReader)如何从 XElement.ReadFrom(XmlReader) 创建的 XElement 对象中删除空格
【发布时间】:2010-02-17 01:45:19
【问题描述】:

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

我已经从 XmlReader 和 here 创建了 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) 删除了漂亮的格式。

【问题讨论】:

  • 我认为 XmlReaderSettings.IgnoreWhitespace 是要走的路。使用此设置时会跳过哪些 xml 元素?
  • 我尝试使用 IgnoreWhitespace 作为真假,但我仍然得到空格。我的意思是,在 IgnoreWhitespace=true 的情况下,会跳过一些节点,即我没有取回 200 个子节点,而是只取回了 100 个——我没有对此进行太多研究。使用 IgnoreWhitespace=false 我可以取回所有 200 个节点。由于它与 XElement.Load() 一起使用,因此在 XmlReader.Create() 调用期间它与 XmlReader 相关,而 IgnoreWhitespace 是我尝试的第一件事。想知道我是否需要为读者设置其他设置。
  • 有人吗?我刚刚遇到了同样的问题...
  • @TheChairman,没有找到解决方案。我结束了我在帖子中提到的事情。

标签: whitespace xmlreader xelement


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-08-15
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 2012-06-18
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多