我正在尝试构建一个XPath查询生成器,以使通用代码尽可能便携。
到目前为止,这是我提出的:
private static string XpathQueryBuilder (string NodeName,string AttributeName = null, string AttributeValue = null)
{
string XpathAttr = "";
if (AttributeName != null)
if (AttributeValue != null)
XpathAttr = "[@" + AttributeName + "='" + AttributeValue + "']";
else
XpathAttr = "[@" + AttributeName + "='*']";
return "//" + NodeName + XpathAttr;
}
我用这种方法看到的问题是,如果我想要查找多个属性或节点,则此功能不起作用。有没有办法动态创建XPath查询,理论上可以接受任意数量的属性和/或节点。
我的优先事项是拥有一个接受多个属性和属性值的函数,因为这种情况比多个节点更可能。
感谢您的时间!
答案 0 :(得分:2)
您可以使用Dictionary<string,string>
使该功能能够接收多个属性参数:
private static string XpathQueryBuilder(string nodeName, Dictionary<string,string> attributes = null)
{
string xpathAttr = "";
if (attributes != null)
{
xpathAttr =
"[" +
String.Join(" and ",
attributes.Select(o =>
{
var attrVal = o.Value ?? "*";
return "@" + o.Key + "='" + attrVal + "'";
})
) + "]";
}
return "//" + nodeName + xpathAttr;
}
示例用法:
var node = "Root";
var attrs = new Dictionary<string, string>
{
{"foo", "bar"},
{"baz", null},
};
var result = XpathQueryBuilder(node, attrs);
Console.WriteLine(result);
<强> dotnetfiddle demo
强>
输出
//Root[@foo='bar' and @baz='*']
答案 1 :(得分:1)
您是否尝试过使用LINQ to XML?
using System.Linq;
using System.Xml;
using System.Xml.Linq;
String GUID = "something";
XElement profilesXel = XElement.Load("your xml file path");
XElement currProfile = (from el in profilesXel
where (String)el.Element("GUID") == GUID
select el).First();
...
答案 2 :(得分:1)
您可以使用LINQ to XML。
它将允许您选择所需的任何数据。
此外,如果您需要更多通用解决方案,可以尝试为此实现your own LINQ Provider。
第二种方式比第一种方式更复杂,但结果你会得到更通用的解决方案,它将通过LINQ链和表达式(lambda等)提供对xml文件的访问。
一些帮助示例的链接:
http://weblogs.asp.net/mehfuzh/writing-custom-linq-provider
http://fairwaytech.com/2013/03/writing-a-custom-linq-provider-with-re-linq/
http://jacopretorius.net/2010/01/implementing-a-custom-linq-provider.html
https://aashishkoirala.wordpress.com/2014/03/10/linq-provider-1/