C# XpathNavigator由于单引号而给出System.Xml.XPath.XPathException

C# XpathNavigator由于单引号而给出System.Xml.XPath.XPathException,c#,xml,xpath,xpathnavigator,C#,Xml,Xpath,Xpathnavigator,我有以下代码 XPathNavigator nav = doc.CreateNavigator(); XPathExpression expr; expr = nav.Compile("//somePath/FieldData[@Location='Payer's Name']/@Value"); 单引号给出了异常System.Xml.XPath.XPathException。我尝试过用斜杠(“\”)、(')和双引号来转义它。但似乎什么都不管用。知道如何解决这个问题吗?xpath“[

我有以下代码

XPathNavigator nav = doc.CreateNavigator();
XPathExpression expr;
expr = nav.Compile("//somePath/FieldData[@Location='Payer's Name']/@Value");

单引号给出了异常System.Xml.XPath.XPathException。我尝试过用斜杠(“\”)、(')和双引号来转义它。但似乎什么都不管用。知道如何解决这个问题吗?

xpath“[@Location='Player's Name']中不能有空格,请将空格去掉。

注意,单引号(麻烦制造者)已替换为双引号

string sUser=“付款人姓名”//根据OP要求,仅考虑单个报价

expr=nav.Compile(“//somePath/FieldData[@Location=\”“+sUser+“\”]/@Value”)

基本上有两种方法可以可靠地处理这种情况

第一种方法是定义一个
VariableContext
,并将要使用的值放入XPath变量中。然后可以使用如下表达式:

//somePath/FieldData[@Location = $user]/@Value
我描述了如何做到这一点。它需要创建一个
VariableContext
类,因为.NET中没有合适的内置类,但我提供的示例应该在大多数情况下都能正常工作

另一个选项是使用Linq转换为XML。如果使用该方法,可以使用Linq而不是XPath查询节点,这样就不存在分隔符的问题:

// here the doc variable is an XElement or XDocument
var value = (from fd in doc.Descendants("FieldData")
            where (string)fd.Attribute("Location") == sUser
            select fd.Attribute("Value")).FirstOrDefault();
或者使用其他Linq语法:

var value = doc.Descendants("FieldData")
               .Where(fd => (string)fd.Attribute("Location") == sUser)
               .Select(fd => fd.Attribute("Value"))
               .FirstOrDefault();

如果您使用C语言,有什么原因不能使用LINQ吗

使用System.Xml.Linq;
公共类XmlParser
{
公共XDocument文档{get;set;}
公共XmlParser(XDocument文档)
{
this.doc=doc;
}
公共列表搜索元素(字符串元素名称)
{
return doc.Elements(elementName).ToList();//这将搜索所有子节点并返回具有指定名称的元素。
}
}

空格不会引起任何问题。我将其与前面的空格一起使用。字符串常量中的空格不是语法元素,也不会有任何区别。问题显然是由撇号分隔的字符串中的撇号,导致分析认为字符串常量的结束时间早于预期,并且无法分析后面的内容使用
规范化空间
我确信它与空间无关
字符串sUser=“U'1”;XmlNode xuser=xmlDocument。选择SingleNode(“tm:tm/tm:Admin/tm:User[@ID=\”“+sUser+\”],TMNamespaceManager)
xml节点没有被选中。我得到0个结果。您写了什么?那么如果变量包含双引号呢?如果您能保证不会发生这种情况,那么这将是可行的,但我肯定会确保文档中记录了这是此代码片段的先决条件。
using System.Xml.Linq;

public class XmlParser
{
    public XDocument doc { get; set;}

    public XmlParser (XDocument doc)
    {
        this.doc = doc;
    }

    public List<XElement> searchElements (String elementName)
    {
        return doc.Elements(elementName).ToList<XElement>(); //this will search for all child nodes and return the elements with the specified name.
    }
}
expr = nav.Compile("//somePath/FieldData[@Location=\"Payer's Name\"]/@Value");