почему XLinq переформатирует мой XML? - PullRequest
1 голос
/ 12 апреля 2011

Я использую XLinq (XML для Linq) для анализа XML-документа, и одна часть документа посвящена представлению форматированного текста и использует атрибут xml:space="preserve" для сохранения пробелов в элементе форматированного текста.

Проблема, с которой я сталкиваюсь, заключается в том, что когда у меня есть элемент внутри расширенного текста, который содержит только подэлемент, но не содержит текста, XLinq переформатирует xml и помещает элемент в свою собственную строку.Это, конечно, приводит к созданию дополнительного пробела, который изменяет исходный контент.

Пример:

<rich-text xml:space="preserve">
    <text-run><br/></text-run>
</rich-text>

приводит к:

<rich-text xml:space="preserve">
    <text-run>
        <br/>
    </text-run>
</rich-text>

Если я добавлю пробел или любой другой текст перед <br/> в исходном xml, примерно так

<rich-text xml:space="preserve">
    <text-run> <br/></text-run>
</rich-text>

синтаксический анализатор не переформатирует xml

<rich-text xml:space="preserve">
    <text-run> <br/></text-run>
</rich-text>

Как я могу предотвратить синтаксический анализатор xml от переформатирования моего элемента?

Является ли это переформатирование нормальным для анализа XMLили это просто нежелательный побочный эффект синтаксического анализатора XLinq?

РЕДАКТИРОВАТЬ: Я анализирую документ следующим образом:

using (var reader = System.Xml.XmlReader.Create(stream))
    return XElement.Load(reader);

Я не использую какие-либо пользовательские XmlReaderSettings или LoadOptions

Проблема возникает, когда я использую свойство .Value в текстовом прогоне XElement, чтобы получить текстовое значение элемента.Вместо получения \n, который будет правильным выводом из исходного xml, я получу

\n \n

Обратите внимание на дополнительный пробел и разрыв строки из-за переформатирования!Переформатирование также можно наблюдать при проверке элемента в отладчике или при вызове .ToString().

1 Ответ

3 голосов
/ 12 апреля 2011

Вы пробовали это:

yourXElement.ToString(SaveOptions.DisableFormatting)

Это должно решить вашу проблему.

Кстати - вы должны сделать то же самое при загрузке:

XElement.Parse(sr, LoadOptions.PreserveWhitespace);
...