Как удалить пробелы из объекта XElement, созданного из XElement.ReadFrom (XmlReader)

Я разбираю большой 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)

Как убрать пробелы?

Изменить: вот что мне нужно было сделать:

  1. Пропуск элементов происходит из-за двух чтений reader.Read() и XElement.ReadFrom(reader) в одной итерации, тем самым пропуская все остальные элементы. Исправление цикла, упомянутого в приведенной выше ссылке, решает это. Проблема не имеет ничего общего с XmlReaderSettings.
  2. xelement.ToString(SaveOptions.DisableFormatting) удаляет красивое форматирование.

person hIpPy    schedule 17.02.2010    source источник
comment
Я бы подумал, что XmlReaderSettings.IgnoreWhitespace - это то, что вам нужно. Какие элементы xml пропускаются при использовании этого параметра?   -  person Jeff Cyr    schedule 17.02.2010
comment
Я пробовал использовать IgnoreWhitespace как true и false, но пробелы все равно получаются. Я имел в виду, что с IgnoreWhitespace = true некоторые узлы пропускаются, т.е. вместо того, чтобы вернуть 200 дочерних узлов, я возвращаю только 100 - я не особо в это разбирался. С IgnoreWhitespace = false я возвращаю все 200 узлов. Поскольку он работал с XElement.Load (), он имел отношение к XmlReader во время вызова XmlReader.Create (), и IgnoreWhitespace был первым, что я попробовал. Интересно, есть ли еще один параметр, который мне нужно установить для читателя.   -  person hIpPy    schedule 17.02.2010
comment
Кто-нибудь? Я просто столкнулся с той же проблемой ...   -  person The Chairman    schedule 13.10.2010
comment
@TheChairman, решения не нашел. Я закончил делать то, что упомянул в посте.   -  person hIpPy    schedule 17.10.2011


Ответы (1)


Попробуйте использовать этот пример из класса XMLTextReader. XMLTextReader имеет метод WhitespaceHandling, для которого вы можете установить значение none. Было бы полезно ответить на этот вопрос, если бы вы могли предоставить тестовый XML-файл, чтобы проверить, работает ли XMLTextReader.

person Ali Khalid    schedule 30.09.2011