C#XML - XPath查询生成器 - 动态创建查询

时间:2016-04-22 14:27:28

标签: c# xml xpath

我正在尝试构建一个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查询,理论上可以接受任意数量的属性和/或节点。

我的优先事项是拥有一个接受多个属性和属性值的函数,因为这种情况比多个节点更可能。

感谢您的时间!

3 个答案:

答案 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/