Xpath для получения родительского узла, где два атрибута подузла имеют конкретное значение - PullRequest
0 голосов
/ 27 февраля 2020

Учитывая этот набор данных по адресу: https://dd.weather.gc.ca/observations/xml/ON/today/today_on_20200129_f.xml

Я думаю, что неправильно обрабатывает пространства имен , но я не уверен, что здесь делать.

Как получить узел om: member, где om: member / om: Observation / om: metadata / set / идентификации-elements / element / name = wmo_station_number и его значение, например, 71704.

У меня есть это:

    xml.Load(url);
    var nsmgr = new XmlNamespaceManager(xml.NameTable);
    nsmgr.AddNamespace("om", "http://www.opengis.net/om/1.0");
    nsmgr.AddNamespace("", "http://dms.ec.gc.ca/schema/point-observation/2.1");        
    nsmgr.AddNamespace("gml", "http://www.opengis.net/gml");
    nsmgr.AddNamespace("xlink", "http://www.w3.org/1999/xlink");
    nsmgr.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
    nsmgr.PushScope();

    //  "Observation//element[@name='{identifier}']";
    var tmp = xml.SelectSingleNode("//om:member/om:Observation/om:metadata", nsmgr);

Я знаю, что это полуумная попытка, но, кажется, как только я пытаюсь что-либо без префикса пространства имен, я получаю ошибки или просто ничего не возвращаю.

Ответы [ 3 ]

1 голос
/ 27 февраля 2020

Вот способ использования System.Xml.Linq

string url = "https://dd.weather.gc.ca/observations/xml/ON/today/today_on_20200129_f.xml";
string om = "http://www.opengis.net/om/1.0";
string xmlns = "http://dms.ec.gc.ca/schema/point-observation/2.1";

var doc = XDocument.Load(url);
var members = doc.Root.Elements(XName.Get("member", om));
var member71074 = members.FirstOrDefault(x => x
                      .Element(XName.Get("Observation", om))
                      .Element(XName.Get("metadata", om))
                      .Element(XName.Get("set", xmlns))
                      .Element(XName.Get("identification-elements", xmlns))
                      .Descendants()
                      .Any(y => y.Attribute("name")?.Value == "wmo_station_number" && 
                                y.Attribute("value")?.Value == "71704"));
0 голосов
/ 27 февраля 2020

Может быть, вы можете попробовать:

//*[@name="wmo_station_number" and @value="71704"]/ancestor::om:member
0 голосов
/ 27 февраля 2020

Вот xpath, который должен вернуть узел.

//om:member/om:Observation/om:metadata/set/identification-elements/element[@name='wmo_station_number'][@value='71704']

enter image description here

...