C#无法将撇号保存到XML

3

我尝试将撇号 ' 保存到XML中,但总是出现错误。

当我想要保存新项目时,首先我会尝试查找它。我使用以下代码:

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

但当 letterName 包含撇号 ' 时,我会收到一个错误,路径没有关闭。

我还找到了这个C# 解析带有撇号的 XML 抛出异常,但是当我按照 Steven 的说法操作时,针对撇号就没问题了,但双引号抛出异常。

我需要同时传递 " 和 '。


name是Xml中的一个属性对吧?如果它是一个属性,那么它不支持撇号。 - Vasanthan
https://dev59.com/_XNA5IYBdhLWcg3wGJwV - kenny
5个回答

3
你可以使用'替换撇号。
letterName = letterName.Replace("'", "'");

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

请查看关于xml文件中特殊字符的此线程

谢谢,我在我的代码中有这个,但后来我保存了letterName,所以saved变成了"'",所以我把它删除了。谢谢。 - Arxeiss
所以我有一个问题。如何保存撇号?因为当我像你一样使用replace时,在文件属性中是“'”,在加载期间,它会转换回来得不好。但是当我执行name.InnerText ="'"时,文件中保存了',而您的代码无法找到此属性... - Arxeiss
是的,当您使用此字符 ' 进行保存并希望再次读取以获取在 C# 中有效的字符串时,您必须执行反转步骤,即再次将 ' 替换为 '。如果您正在进行 Web 项目(我不确定它是否适用于 Windows 项目),您还可以检查 HttpUtility.HtmlEncode(string)HttpUtility.HtmlDecode(string) 来进行这些更改,添加对 System.Web 的引用。请参阅:http://msdn.microsoft.com/en-us/library/73z22y6h.aspx - Felipe Oriani
1
我相当确定,如果我错了请纠正我,这将防止发生错误,但如果letterName中有撇号,则无法找到您要查找的节点。在这种情况下,SelectSingleNode()将返回null。 - JLRishe
@JLRishe,是的,你说得对。因为我总是只保存一个字符,所以我做了一些丑陋的事情。如果你想保存撇号,xpath就用引号括起来,否则用撇号括起来。但是下次,我想解决这个问题。这个答案允许我保存撇号,但不能找到它。 - Arxeiss

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变量,但这通常是过度设计。

1

你尝试过将它转义为这样吗:

\'

1

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接