我正在解析一个大的xml文件。所以我将XmlReader与XElement结合使用,而不是XElement.Load()。如何从XElement.ReadFrom(XmlReader)创建的XElement对象中删除空格
我已经从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)
从而跳过所有其他元素。修复上面链接中提到的循环解决了这个问题。这个问题与无关。 xelement.ToString(SaveOptions.DisableFormatting)
删除漂亮的格式。
我会认为XmlReaderSettings.IgnoreWhitespace是要走的路。使用此设置时,会跳过哪些xml元素? – 2010-02-17 02:29:01
我试图用IgnoreWhitespace作为true和false,但我仍然得到空白。我的意思是,在IgnoreWhitespace = true的情况下,跳过了一些节点,即不是回收200个子节点,而是只返回100个节点 - 我对此没有太多的了解。使用IgnoreWhitespace = false我找回所有200个节点。 由于它与XElement.Load()一起工作,它在XmlReader.Create()调用期间与XmlReader有关,而IgnoreWhitespace是我尝试的第一件事。想知道是否有另一个设置需要为读者设置。 – hIpPy 2010-02-17 16:09:40
有人吗?我刚碰到同样的问题... – 2010-10-13 13:55:41