Форум программистов, компьютерный форум, киберфорум
Наши страницы
LINQ
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Захарка
98 / 102 / 47
Регистрация: 16.06.2013
Сообщений: 434
Завершенные тесты: 3
#1

LINQ to XML: убрать автоформатирование текста

02.09.2015, 17:40. Просмотров 819. Ответов 6
Метки нет (Все метки)

Здравствуйте, такая проблема возникла:
Мне нужно записать в XElement форматированный текст, который сам по себе содержит теги. Но! При простом добавлении происходит автоформатирование, с заменой всех < и >, на &lt; и &gt;.
Беда в том, что мне необходимо иметь именно теги, а текст может быть абсолютно любым.
Единственным вариантом мне видится писать парсер, и капитально усложнять код(благо внутренних тегов всего штук 5-7), либо по-тупому, после сохранения файла пройтись по нему заменой символов.
Вопрос в чём - возможно есть где-либо параметр, отключающий автоформатирование текста?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.09.2015, 17:40
Ответы с готовыми решениями:

При помощи LINQ to XML считать параметры из XML
Помогите при помощи LINQ to XML считать следующие параметры из XML: id,...

Парсинг XML-файла с помощью LINQ to XML
Здрасивуйте. Трабл никак не могу понять в чем дело не могу считать инфу с XML...

Возможная прибыль. linq to xml
Здравствуйте! Есть два файла: 1)Товары -код (уникальный) -название...

Не работает linq to xml запрос
Здравствуйте. У меня есть вот такой xml &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;...

Linq XML - повторяющийся атрибут
Здравствуйте! Помогите решить проблему. Есть код: XDocument doc = new...

6
OwenGlendower
Супер-модератор
Эксперт .NET
9052 / 8003 / 3420
Регистрация: 17.03.2014
Сообщений: 15,824
Записей в блоге: 1
02.09.2015, 18:57 #2
Захарка, если я тебя правильно понял, то:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
XElement root = new XElement("root");
string xmlText = "<item>a</item><item>b</item>";
root.Add(ReadXmlDocumentFragment(xmlText));
 
public static IEnumerable<XElement> ReadXmlDocumentFragment(string xmlStr) {  
    XmlReaderSettings settings = new XmlReaderSettings();  
    settings.ConformanceLevel = ConformanceLevel.Fragment;  
 
    using(XmlReader reader = XmlReader.Create(new StringReader(xmlStr), settings)) {  
        while(reader.ReadState != ReadState.EndOfFile) {  
            if(reader.NodeType == XmlNodeType.Element) {  
                XElement xEl = XElement.ReadFrom(reader) as XElement;  
                if(xEl != null) {  
                    yield return xEl;  
                }  
            } else {  
                reader.Read();  
            }  
        }  
    }  
}
Если ты точно знаешь что в тексте всегда будет ровно один корневой элемент, то вместо ReadXmlDocumentFragment можно использовать XElement.Parse
0
Захарка
98 / 102 / 47
Регистрация: 16.06.2013
Сообщений: 434
Завершенные тесты: 3
02.09.2015, 19:03  [ТС] #3
OwenGlendower, хмм... нет, не совсем то. Ваша функция выдёргивает ТОЛЬКО теги, и текст внутри них, а мне нужен полностью. Смотрите:
Исходный текст, чисто для примера:
Кликните здесь для просмотра всего текста

бла-бла-бла <b>АААА</b>... ФХТАГН! <image /> <br />
БББББ

И, в итоговом, сохранённом файле он так и должен выглядеть. А, при работе вашей функции будет:
Кликните здесь для просмотра всего текста

<b>АААА</b>
<image />
<br />
0
OwenGlendower
Супер-модератор
Эксперт .NET
9052 / 8003 / 3420
Регистрация: 17.03.2014
Сообщений: 15,824
Записей в блоге: 1
02.09.2015, 19:10 #4
Лучший ответ Сообщение было отмечено Захарка как решение

Решение

Захарка, кто мешает добавить поддержку текста и других типов узлов?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static IEnumerable<XNode> ReadXmlDocumentFragment(string xmlStr) {  
    XmlReaderSettings settings = new XmlReaderSettings();  
    settings.ConformanceLevel = ConformanceLevel.Fragment;  
 
    using(XmlReader reader = XmlReader.Create(new StringReader(xmlStr), settings)) {  
        while(reader.ReadState != ReadState.EndOfFile) {  
            if(reader.NodeType == XmlNodeType.Element) {  
                yield return (XElement)XElement.ReadFrom(reader);  
            }                
            else if (reader.NodeType == XmlNodeType.Text) {
                yield return (XText)XText.ReadFrom(reader);
            } else {  
                reader.Read();  
            }  
        }  
    }  
}
1
Захарка
98 / 102 / 47
Регистрация: 16.06.2013
Сообщений: 434
Завершенные тесты: 3
02.09.2015, 19:13  [ТС] #5
OwenGlendower, Ошибку выдаёт, пишел, что низзя привести тип XText, к типу XElement...
Кроме того, я поступил прощще - тупо добавил к тексту открывающий и закрывающий теги, благодаря чему, и первый вариант функции прекрасно работает.
0
OwenGlendower
Супер-модератор
Эксперт .NET
9052 / 8003 / 3420
Регистрация: 17.03.2014
Сообщений: 15,824
Записей в блоге: 1
02.09.2015, 19:17 #6
Цитата Сообщение от Захарка Посмотреть сообщение
Ошибку выдаёт, пишел, что низзя привести тип XText, к типу XElement
Возвращаемый тип нужно было поменять на IEnumerable<XNode>

Цитата Сообщение от Захарка Посмотреть сообщение
я поступил прощще - тупо добавил к тексту открывающий и закрывающий теги
Ок.
0
Захарка
98 / 102 / 47
Регистрация: 16.06.2013
Сообщений: 434
Завершенные тесты: 3
02.09.2015, 19:18  [ТС] #7
OwenGlendower, ой, сорри, я - дебил, скопировал только кусок кода, вот и получил ошибку... Действительно такой вариант лучше. На самом деле, до прихода второго сообщения я и ковырялся в нём, именно в эту сторону. Спасибо ещё раз.
0
02.09.2015, 19:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2015, 19:18

Linq и xml (добавить элемент)
Здравствуйте, помогите пожалуйста люди добрые. Имеется xml файл со следующим...

Xml linq добавить поле
Программно создаю следующий xml документ &lt;?xml version=&quot;1.0&quot;...

LINQ to XML Null Reference
часть документа XML, таких несколько элементов &lt;weather&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru