Я разбираю большой XML-файл. Поэтому я использую XmlReader в сочетании с XElement вместо XElement.Load ().
Я создал объект XElement из XmlReader, как показано ниже, и здесь.
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 в базе данных в виде строки без пробелов. Ни один из трех способов ниже не работает. Замечу: если я загружаю xml в память с помощью XElement.Load (), 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()
Параметры XmlReaderSettings, которые я использую для объекта XmlReader, приведены ниже. Я безуспешно пробовал IgnoreWhitespace = true / false, но не могу установить его как true, так как некоторые элементы пропускаются (причину пропуска см. Почему пропускает ли XmlReader все остальные элементы, если нет разделителя пробелов?).
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)
удаляет красивое форматирование.