Как удалить пробелы из объекта XElement, созданного из XElement.ReadFrom (XmlReader) - PullRequest
8 голосов
/ 17 февраля 2010

Я анализирую большой 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 в базе данных в виде строки без пробелов. Ни один из нижеприведенных 3 способов не работает. Просто обратите внимание, если я загружаю 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) удаляет красивое форматирование.

1 Ответ

1 голос
/ 01 октября 2011

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

...