我尝试将撇号'保存为XML,但总是出错。
当我想保存新项目时,首先我试图找到它。我用这个
XmlNode letters = root.SelectSingleNode("//letters");
XmlNode oldFileLetter = letters.SelectSingleNode("letter[@name='"+letterName+"']");
但是当letterName
包含撇号'我收到错误时,该路径未关闭
我也发现了c# parsing xml with and apostrophe throws exception但是当我做了史蒂文所说的时候,撇号是可以的,但双引号会引发异常。
我也需要传递“和”。
答案 0 :(得分:3)
你也可以用'
letterName = letterName.Replace("'", "'");
XmlNode letters = root.SelectSingleNode("//letters");
XmlNode oldFileLetter = letters.SelectSingleNode("letter[@name='"+letterName+"']");
查看this thread关于xml文件中特殊字符的信息。
答案 1 :(得分:1)
你有没有试过逃避它:
\'
答案 2 :(得分:1)
这里的问题是你的XPath已经有一个撇号,表示XPath中字符串的开头,所以你的letterName值中的任何撇号都会在关闭字符串值时进行交互。
与Felipe的建议相反,XPath本身不是XML,因此用'
替换撇号是行不通的。它将避免错误,但如果letterName包含撇号,您将找不到您正在寻找的节点。此外,"'"
和"\'"
之间的C#没有区别,因此也无济于事。
我建议循环使用字母元素并确定@name具有您正在寻找的值的那个元素:
XmlNode oldFileLetter = null;
foreach(XmlNode letterNameNode in letters.SelectNodes("letter/@name"))
{
if(letterNameNode.Value.Equals(letterName))
{
oldFileLetter = letterNameNode.ParentNode;
break;
}
}
我所知道的唯一其他方法涉及绑定一个系统以允许在路径中定义和使用XPath变量,但这通常是过度的。
答案 3 :(得分:1)
你必须把它写成我认为的实体...... 我不确定,但我记得以前遇到过这个问题。
看看这个维基百科帖子...... http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references
答案 4 :(得分:0)
const string apo = "\'";
XmlNode letters = root.SelectSingleNode("//letters");
XmlNode oldFileLetter = letters.SelectSingleNode("letter[@name="+apo+letterName+apo+"]")