在以下位置获得该数据集: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);
我知道这是一次机智的尝试,但似乎一尝试任何没有命名空间前缀的操作,我都会收到错误或什么也没回来。
答案 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']
答案 2 :(得分:0)
也许您可以尝试:
//*[@name="wmo_station_number" and @value="71704"]/ancestor::om:member