由于单引号,XpathNavigator提供System.Xml.XPath.XPathException

时间:2014-12-27 15:20:51

标签: c# xml xpath xpathnavigator

我有以下代码

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

单引号提供异常System.Xml.XPath.XPathException。我试过用斜杠(' \'),('),双单引号来逃避它。但似乎没什么用。知道如何解决这个问题吗?

5 个答案:

答案 0 :(得分:1)

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

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

//somePath/FieldData[@Location = $user]/@Value

我描述了如何做到in this post。它需要创建一个VariableContext类,因为.NET中没有内置任何适合的类,但我提供的示例在大多数情况下应该按原样运行。

另一种选择是使用Linq-to-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();

答案 1 :(得分:0)

你在xpath中没有空格" [@ Location ='玩家的名字']占用空间

答案 2 :(得分:0)

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

string sUser = "Payer's name"; // as per OP requirement considering only single quote expr = nav.Compile("//somePath/FieldData[@Location=\"" + sUser + "\"]/@Value")

答案 3 :(得分:0)

如果您使用C#语言,是否有任何理由不能使用LINQ?

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.
    }
}

答案 4 :(得分:0)

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