【问题标题】:C# cannot save apostrophe to XMLC# 无法将撇号保存到 XML
【发布时间】:2013-01-04 11:29:57
【问题描述】:

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

当我想保存新项目时,我首先尝试找到它。我用这个

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

但是当letterName 包含撇号'我得到一个错误,那个路径没有关闭

我也发现了这个c# parsing xml with and apostrophe throws exception,但是当我按照 Steven 所说的进行操作时,撇号是可以的,但是双引号会抛出异常。

我也需要传递 " 和 '。

【问题讨论】:

标签: c# xml


【解决方案1】:

您也可以将撇号替换为'

letterName = letterName.Replace("'", "'");

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

查看this thread 了解 xml 文件中的特殊字符。

【讨论】:

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

这里的问题是您的 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】:

    您是否尝试过这样逃避它:

    \'
    

    【讨论】:

      【解决方案4】:

      我认为你必须把它写成一个实体...... 我不确定,但我记得以前遇到过这个问题。

      看看这个维基百科线程...... http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references

      【讨论】:

        【解决方案5】:
        const string apo = "\'";
        XmlNode letters = root.SelectSingleNode("//letters");
        XmlNode oldFileLetter = letters.SelectSingleNode("letter[@name="+apo+letterName+apo+"]")
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-02
          • 1970-01-01
          • 1970-01-01
          • 2012-03-28
          • 2017-08-20
          • 1970-01-01
          相关资源
          最近更新 更多