Экранирование ТОЛЬКО содержимого Node в XML - PullRequest
2 голосов
/ 21 октября 2011

У меня есть часть кода, упомянутая ниже.

    //Reading from a file and assign to the variable named "s"
    string s = "<item><name> Foo </name></item>";
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(s);

Но он перестает работать, если содержимое содержит символы вроде «<», «>» и т. Д.

string s = "<item><name> Foo > Bar </name></item>";

Я знаю, мне нужно экранировать эти символы перед загрузкой, но, если мне нравится,

 doc.LoadXml(System.Security.SecurityElement.Escape(s));

, теги (<,>) также экранируются, и в результате возникает ошибка.

Как я могу решить эту проблему?

Ответы [ 4 ]

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

Похоже, что созданные вами строки являются строками, а не допустимым XML.Вы можете получить строки, сгенерированные как действительный XML, ИЛИ если вы знаете, что строки всегда будут именем, тогда не включайте теги XML <item> и <name> в данные.

Затем при создании XMLDocument.выполните CreateElement и присвойте свою строку перед сохранением результатов.

XmlDocument doc = new XmlDocument(); 
XmlElement root = doc.CreateElement("item");
doc.AppendChild(root);
XmlElement name = doc.CreateElement("name");
name.InnerText = "the contents from your file";
root.AppendChild(name);
1 голос
/ 21 октября 2011

Назначьте содержимое строки свойству InnerXml узла.

 var node = doc.CreateElement("root");
 node.InnerXml = s;

Посмотрите на - Различные способы экранирования строки XML в C #

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

хитрое решение:

    string s = "<item><name> Foo > Bar </name></item>";
    s = Regex.Replace(s, @"<[^>]+?>", m => HttpUtility.HtmlEncode(m.Value)).Replace("<","ojlovecd").Replace(">","cdloveoj");
    s = HttpUtility.HtmlDecode(s).Replace("ojlovecd", "&gt;").Replace("cdloveoj", "&lt;");
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(s);
1 голос
/ 21 октября 2011

Предполагая, что ваш контент не будет никогда содержать символы "]]>", вы можете использовать CDATA.

string s = "<item><name><![CDATA[ Foo > Bar ]]></name></item>";

В противном случае вам потребуется HTML-кодирование ваших специальных символови декодируйте их, прежде чем использовать / отображать их (если только они не в браузере).

string s = "<item><name> Foo &gt; Bar </name></item>";
...