Как читать / писать текст и избегать специальных символов (<,,> и т. Д.) - PullRequest
0 голосов
/ 18 ноября 2010

В настоящее время я выполняю синтаксический анализ некоторых сценариев C #, которые хранятся в базе данных, извлекает тело некоторых методов из кода, а затем записывает файл XML, который показывает идентификатор, тело извлеченных методов и т. Д.

Проблема, которую я сейчас пишу, состоит в том, что когда я пишу код в XML, мне нужно записать его в виде литеральной строки, поэтому я подумал, что мне нужно добавить " в начале и в конце:

new XElement("MethodName", @"""" + Extractor.GetMethodBody(rule.RuleScript, "MethodName") + @"""")

Это работает, но у меня есть проблема, вещи, которые записаны в БД как

for (int n = 1; n < 10; n++)

записываются в файл XML (или выводятся на консоль) как:

for (int n = 1; n &lt; 10; n++)

Как мне заставить его напечатать фактический символ, а не его код? Код в базе данных написан с фактическими характеристиками, а не с «101» *, как у «безопасного».

Ответы [ 3 ]

7 голосов
/ 18 ноября 2010

Внутри xml (как текстовое значение) это правильно для < для кодирования как &lt;. Внутреннее представление xml не влияет на значение, поэтому позвольте ему закодироваться. Вы можете обойти это, форсируя раздел CDATA , но, честно говоря, оно того не стоит. Но вот пример использования CDATA:

string noEncoding = new XElement("foo", new XCData("a < b")).ToString();
1 голос
/ 18 ноября 2010

Я не знаю, какое программное обеспечение он собирается использовать для чтения XML, но любое, о котором я знаю, выдает ошибку при разборе любого XML, который не экранирует символы <и>, которые не используются в качестве начала тега, и заканчивается. Это просто часть спецификации XML; эти символы зарезервированы как часть структуры.

На вашем месте я бы расстался с утилитами System.XML и сам написал этот файл. Любой приличный инструмент XML будет кодировать эти символы для вас, поэтому вам, вероятно, не следует их использовать. С помощью StreamWriter создайте вывод так, как вам говорят. Таким образом, вы можете сами контролировать вывод XML, даже если это означает нарушение спецификации XML.

using (StreamWriter sw = new StreamWriter("c:\\xmlText.xml", false, Encoding.UTF8))
{
 sw.WriteLine("<?xml version=\"1.0\"?>");
 sw.WriteLine("<Class>");

 sw.Write("\t<Method Name=\"MethodName\">");
 sw.Write(@"""" + Extractor.GetMethodBody(rule.RuleScript, "MethodName") + @"""");
 sw.WriteLine("</Method>");

 // ... and so on and so forth

 sw.WriteLine("</Class>");
}
1 голос
/ 18 ноября 2010

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

Литеральная строка - это строка, которая написана буквально в коде, например "Hello world". Если вы получаете строку любым другим способом, это не буквальная строка.

Кавычки, которые вы добавили в строку, просто добавляют кавычки к значению, они больше ничего не делают со строкой. Вы можете добавить строку с кавычками просто отлично:

new XElement("MethodName", Extractor.GetMethodBody(rule.RuleScript, "MethodName"))

Теперь символы, которые кодируются, когда они помещаются в XML, объясняются тем, что им необходимо кодировать . Вы не можете поместить символ < в значение без его кодирования.

Если вы покажете XML, вы увидите закодированные значения, и это всего лишь знак того, что он работает так, как должен. Когда вы читаете XML, закодированные символы будут декодированы, и вы получите исходную строку.

...