Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xpath获取父节点的一个值,其中子节点的两个属性具有特定值_C#_Xml_Xpath_Xml Namespaces_Xmldocument - Fatal编程技术网

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

C# Xpath获取父节点的一个值,其中子节点的两个属性具有特定值,c#,xml,xpath,xml-namespaces,xmldocument,C#,Xml,Xpath,Xml Namespaces,Xmldocument,鉴于此数据集位于: 我认为我没有正确处理名称空间,但我不确定在这里该怎么做 如何获取一个om:member节点,其中om:member/om:Observation/om:metadata/set/identification elements/element/name=wmo_station_编号,其值为,例如71704 我有这个: xml.Load(url); var nsmgr = new XmlNamespaceManager(xml.NameTable); ns

鉴于此数据集位于:

我认为我没有正确处理名称空间,但我不确定在这里该怎么做

如何获取一个om:member节点,其中om:member/om:Observation/om:metadata/set/identification elements/element/name=wmo_station_编号,其值为,例如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);

我知道这是一个愚蠢的尝试,但似乎只要我尝试没有名称空间前缀的任何操作,我就会得到错误或什么都没有返回。

这里是应该返回节点的xpath

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

这里有一种使用
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"));
也许你可以试试:

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

谢谢你的回答。。不管出于什么原因,这对我不起作用。我是说它看起来不错。我一直在玩这样的游戏,似乎只要我引入一个没有前缀的元素名,它就会返回null。我想我的问题与名称空间管理器有关。
我引入了一个没有前缀的元素名,它返回null
你的意思是没有
@
名称
属性?我想这会给我一些数据:://om:member/om:Observation/om:metadata/set,但我得到的是null。set元素没有前缀,这很奇怪。在“谢谢”中尝试使用
//om:member/om:Observation/om:metadata/set
xpath时,我看到了数据。我会使用它,因为它可以得到我想要的数据。仍然想知道我所做的有什么问题,但无论如何这是更好的。@carny666我做了一个更新,它延长了代码长度,但应该会提高性能,因为这么早使用.subjects()将检查比需要更多的节点。恐怕我对如何使用XmlDocument不太熟悉