【发布时间】: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)
如何删除空格?
编辑:这是我必须做的:
- 元素跳过是由于在同一迭代中两次读取
reader.Read()和XElement.ReadFrom(reader)从而跳过了所有其他元素。修复上面链接中提到的循环可以解决这个问题。该问题与XmlReaderSettings无关。 -
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