Xpath获取父节点,其中子节点的两个属性具有特定值

时间:2020-02-27 13:49:41

标签: c# xml xpath xml-namespaces xmldocument

在以下位置获得该数据集:https://dd.weather.gc.ca/observations/xml/ON/today/today_on_20200129_f.xml

我认为我不能正确处理名称空间,但不确定在这里做什么。

我将如何获得om:member节点,其中om:member / om:Observation / om:metadata / set / identification-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 个答案:

答案 0 :(得分:1)

这是使用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"));

答案 1 :(得分:0)

这是应该返回节点的xpath。

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

enter image description here

答案 2 :(得分:0)

也许您可以尝试:

//*[@name="wmo_station_number" and @value="71704"]/ancestor::om:member