我正在解析一个大的 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)
如何删除空格?
编辑:这是我必须做的:
- 元素跳过是由于两次读取
reader.Read()
,并且XElement.ReadFrom(reader)
在同一次迭代中,因此跳过了所有其他元素。修复上面链接中提到的循环可以解决这个问题。这个问题与XmlReaderSettings
. xelement.ToString(SaveOptions.DisableFormatting)
删除漂亮的格式。