我正在解析一个大型的xml文件。因此,我将XmlReader与XElement结合使用,而不是XElement.Load()。
我已经从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)
,从而跳过了其他所有元素。修复上面链接中提到的循环可以解决该问题。这个问题与XmlReaderSettings
无关。 xelement.ToString(SaveOptions.DisableFormatting)
删除漂亮的格式。 最佳答案
尝试使用XMLTextReader类的this example。 XMLTextReader具有方法“WhitespaceHandling”,您可以将其设置为无。如果您可以提供一个测试XML文件,以测试XMLTextReader的工作原理,那么回答这个问题将是很有帮助的。
关于whitespace - 如何从XElement.ReadFrom(XmlReader)创建的XElement对象中删除空格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2277791/