【问题标题】:How to get a node element attrbutes' values with Xpath using XPathEvaluate method in C#?如何在 C# 中使用 XPathEvaluate 方法通过 Xpath 获取节点元素属性的值?
【发布时间】:2019-09-27 07:23:58
【问题描述】:

考虑以下 XML 正文;

    <whitelist
              whitelist_entry_nb="4"
              whitelist_size="4000">
              <locations>
                <location
                  path="kate-api.gateway.zigbee-network.components.{component}.whitelist.{whitelist-entry}">
                  <var-fields>
                    <var-field
                      key="component"
                      value="F9BA2F5E2E1EBE1358F70691990F0918" />
                    <var-field
                      key="whitelist-entry"
                      value="8.042620EA5A3380" />
                  </var-fields>
                </location>
            <location
              path="kate-api.gateway.zigbee-network.components.{component}.whitelist.{whitelist-entry}">
              <var-fields>
                <var-field
                  key="component"
                  value="F9BA2F5E2E1EBE1358F70691990F0918" />
                <var-field
                  key="whitelist-entry"
                  value="8.043D147AA44A80" />
              </var-fields>
            </location>
</whitelist>

Xpath 是:

/whitelist/locations/location/var-fields/var-field[@key="whitelist-entry" and @value="8.0440147AA44A80"]

Xpath 结果必须如下:

Element='<var-field key="whitelist-entry" value="8.0440147AA44A80"/>'

我想要做的是将此 xpath 传递给 XPathEvaluate 方法并到达 XPath 结果元素内部的属性值,即“白名单”和“8.0440147AA44A80”。我想检查这些值是否存在于 xml 中。

我正在尝试将此 xpath 传递给 XpathEvaluate 方法,如下所示:

var doc = XDocument.Parse(System.Web.HttpUtility.HtmlDecode(response.Body));
var result = doc.XPathEvaluate(matchString[i].xpath);

*matchString 来自 Json 文件

XPathEvaluate 方法返回一个布尔值、字符串或 IENumerable; 我可以在这里控制布尔结果如下:

if(result is bool){
    resultBool = (bool) result;
    if(resultBool)
    {
        Report.Success("Content " + matchString[i].xpath + "is in reponse");
    }
    else
    {
        Report.Failure("Content " + matchString[i].xpath + "is not in reponse");
    }
}

我希望输出是 Element=''。 我将能够使用 SelectNode 方法等从这里获取属性值。

【问题讨论】:

    标签: c# xml xpath


    【解决方案1】:
    var match = new Regex("^(.*)\\[@key=\"(.*?)\".*@value=\"(.*?)\"]").Match(matchString[i].xpath);
    
    try
    {
        string evaluator = match.Groups[1].Value;    // /whitelist/locations/location/var-fields/var-field
        string target_key = match.Groups[2].Value;   // whitelist-entry
        string target_value = match.Groups[3].Value; // 8.0440147AA44A80
    
        var doc = XDocument.Parse(System.Web.HttpUtility.HtmlDecode(response.Body));
        var fields = (IEnumerable)doc.XPathEvaluate(evaluator);
        var values = fields.Cast<XElement>()
                               .Select(x => new {
                                   key = x.Attribute("key").Value,
                                   value = x.Attribute("value").Value
                               }).ToList();
    
        bool found = false;
    
        foreach (var val in values)
        {
            if (val.key == target_key && val.value == target_value)
            {
                found = true;
            }
        }
    
        if(found)
        {
            Report.Success("Content " + matchString[i].xpath + "is in reponse");
        }
        else
        {
            Report.Failure("Content " + matchString[i].xpath + "is not in reponse");
        }
    }
    catch
    {
        //Invalid xPath format
    }
    

    【讨论】:

    • 问题是我不能使用这样的代码行; var fields = (IEnumerable)doc.XPathEvaluate("/whitelist/locations/location/var-fields/var-field");我需要从整个 Json 文件中获取 xpath 变量。我不能使用类型化的 xpath,或者我不能将属性值拆分为参数。基本上我不能拆分xpath,xpath就像一个常量。
    • @rpcalisir 因此,如果您已经从另一个来源获得评估路径,并且如果我理解正确,它看起来像 /whitelist/locations/location/var-fields/var-field[@key="whitelist-entry" and @value="8.0440147AA44A80"],您不能修剪 [ ] 部分吗?
    • 是的,你理解正确。我从另一个来源获取 xpath,你的意思是我可以修剪程序中的 [] 部分吗?
    • 假设matchString[i].xpath 包含我上面提到的值,matchString[i].xpath.Substring(0, matchString[i].xpath.IndexOf("[")); 将返回/whitelist/locations/location/var-fields/var-field,这将是一个有效的 XPathEvaluate 输入。如果上述格式不适用于所有场景,请发布更多示例,我可以使用正则表达式解析分享解决方案
    • 是的,我想这会起作用,但我需要尝试。你能告诉我如何达到这些键和值变量吗?因为我无法达到这些值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2012-08-28
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多