Как получить значения атрибута элемента узла с помощью Xpath, используя метод XPathEvaluate в C #? - PullRequest
0 голосов
/ 27 сентября 2019

Рассмотрим следующее тело 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"/>'

Что я хочуdo передает этот 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 возвращает тип bool, string или IENumerable;Что я могу контролировать результат bool здесь следующим образом:

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 и т. Д.

1 Ответ

0 голосов
/ 27 сентября 2019
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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...