我有以下代码
XPathNavigator nav = doc.CreateNavigator();
XPathExpression expr;
expr = nav.Compile("//somePath/FieldData[@Location='Payer's Name']/@Value");
单引号提供异常System.Xml.XPath.XPathException。我试过用斜杠(' \'),('),双单引号来逃避它。但似乎没什么用。知道如何解决这个问题吗?
答案 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");