С# не может сохранить апостроф в XML

Я пытался сохранить apostrophe 'в XML, но всегда получаю сообщение об ошибке.

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

XmlNode letters = root.SelectSingleNode("//letters");
XmlNode oldFileLetter = letters.SelectSingleNode("letter[@name='"+letterName+"']");

но когда letterName содержит апостроф ', я получаю сообщение об ошибке, этот путь не закрывается

Я также нашел этот С# синтаксический анализ xml с апострофом и исключение, но когда я сделал то, что сказал Стивен, это нормально для апострофа, но двойное кавычки выбрасывает исключение.

Мне нужно передать "и" тоже.

5 ответов

Проблема заключается в том, что ваш XPath уже имеет апостроф, указывающий начало строки в XPath, поэтому любой апостроф в вашем имени letterName будет interpereted как закрытие строкового значения.

В отличие от совета Felipe, XPaths сами не являются XML, поэтому замена апострофов на ' не будет работать. Это позволит избежать ошибки, но вы не найдете node, который вы ищете, если letterName содержит апостроф. Кроме того, нет разницы в С# между "'" и "\'", поэтому это тоже не поможет.

Я предлагаю прокручивать элементы письма и идентифицировать ту, где @name имеет значение, которое вы ищете:

XmlNode oldFileLetter = null;
foreach(XmlNode letterNameNode in letters.SelectNodes("letter/@name"))
{
 if(letterNameNode.Value.Equals(letterName))
 {
 oldFileLetter = letterNameNode.ParentNode;
 break; 
 }
}

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


Вы также можете заменить апостроф на '

letterName = letterName.Replace("'", "'");
XmlNode letters = root.SelectSingleNode("//letters");
XmlNode oldFileLetter = letters.SelectSingleNode("letter[@name='"+letterName+"']");

Посмотрите этот поток о специальных символах в файле xml.


Вы пытались избежать этого как такового:

\'


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

Посмотрите на эту википедию... http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references


const string apo = "\'";
XmlNode letters = root.SelectSingleNode("//letters");
XmlNode oldFileLetter = letters.SelectSingleNode("letter[@name="+apo+letterName+apo+"]")

licensed under cc by-sa 3.0 with attribution.