Как получить специальные объекты, такие как в выводе документа xml при использовании LinqXml - PullRequest
0 голосов
/ 25 июля 2010

Я пытаюсь сгенерировать XML-документ, используя LinqXml, для которого "\ n" будет "& # 10;"в значении XElement, независимо от того, какие настройки я пробую с XmlWriter, он все равно выдает «\ n» в окончательном XML-документе.

Я попробовал следующее, «Расширил XmlWriter».Переопределил XmlWriterSettings, изменил обработку NewLine.Оба варианта не сработали для меня.

Любая помощь / указатели будут оценены.

С уважением Стивен

Ответы [ 2 ]

1 голос
/ 29 июля 2010

LINQ to XML работает поверх XmlReader / XmlWriter.XmlReader является реализацией процессора XML / анализатора, как описано в спецификации XML.Эта спецификация в основном говорит, что парсер должен скрыть фактическое представление в тексте из приложения выше.Это означает, что оба \ n и должны быть указаны как одно и то же.Вот что он делает.

XmlWriter это то же самое в обратном направлении.Его цель - сохранить входные данные таким образом, чтобы при разборе вы получили точно то же самое.Таким образом, запись текстового значения "\ n" запишет его так, что синтаксический анализатор сообщит обратно "\ n" (в этом случае выходной текст будет \ n для текстового узла, но для атрибута из-за нормализации, которая происходит в значениях атрибута).Следуя этой идее, попытка записать текстовое значение "" на самом деле выпишет "", потому что когда читатель анализирует, что он вернет оригинал "".

LINQ to XML использует XmlWriter для сохранения дерева в XMLфайл.Таким образом, вы получите описанное выше поведение.

Вы можете записать дерево в XmlWriter самостоятельно (или его частью), и в этом случае вы получите больший контроль.В частности, это позволит вам использовать метод XmlWriter.WriteCharEntity, который заставляет писателя выводить указанный символ в виде символьной сущности, которая находится в $ # xXX;формат.(Обратите внимание, что он будет использовать шестнадцатеричный формат, а не десятичный).

0 голосов
/ 26 июля 2010

В чем причина наличия экранированного значения для '\ n' в элементе XML? Символ новой строки действителен внутри элемента XML, и при повторном анализе XML он будет проанализирован, как вы ожидаете.

То, что вы ищете, произойдет, если символ новой строки будет помещен в значение атрибута XML:

        XElement xEl = new XElement("Root", 
            new XAttribute("Value", 
                "Hello," + Environment.NewLine + "World!"));

        Console.WriteLine(xEl);

Выход:

<Root Value="Hello,&#xD;&#xA;World!" />
...