C#使用带有撇号的XML解析会抛出异常。

3

我正在解析一个XML文件,在尝试查找一个节点中包含撇号时遇到问题。如果项目名称没有这个符号,一切都正常工作。我已经尝试使用不同的转义字符替换撇号,但没有什么成功。

string s = "/itemDB/item[@name='" + itemName + "']";

// Things i have tried that did not work
// s.Replace("'", "''");
// .Replace("'", "\'");

XmlNode parent = root.SelectSingleNode(s);

我总是收到XPathException异常。请问正确的做法是什么。谢谢。


你是在尝试类似这样的操作吗:<XYZ X='Lol"/> 其中 LoL 是你真正想要的内容? - Machinarius
你能给一个你正在尝试解析的XML的例子吗? - Andy Lowry
这是一个简单版本的代码出错信息: <itemDB> <item name="abc's cfd"/> <itemDB> - poco
2个回答

4

将撇号替换为&apos;


2
+1 - 还有一些其他字符可能也需要转义。http://weblogs.sqlteam.com/mladenp/archive/2008/10/21/Different-ways-how-to-escape-an-XML-string-in-C.aspx - Josh
我尝试了 s= s.Replace("'", "'"); 这个方法可以让我避开异常,但是返回的是 null,因为它认为它不在 XML 文件中。项目名称是随机的。连接是我能想到的唯一选择正确节点的方式。有更好的方法吗? - poco
我正在解析的XML文件相当大,而且我没有修改它的选择。该文件中有以下内容:<item name="abc's def"/>。 - poco

1
你可以像这样做:
XmlDocument root = new XmlDocument();

root.LoadXml(@"<itemDB><item name=""abc'def""/></itemDB>");

XmlNode node = root.SelectSingleNode(@"itemDB/item[@name=""abc'def""]");

请注意verbatim字符串字面量'@'和双引号。
您的代码将如下所示,无需替换任何内容:
var itemName = @"abc'def";

string s = @"/itemDB/item[@name=""" + itemName + @"""]";

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