如何在C#中选择带XPath的节点?

简单的问题,我只想从标签中选择文本。 这就是我所拥有的,但Xpath与任何东西都不匹配。

public static void TestXPath() { string xmlText = ""; xmlText += ""; xmlText += "Normal 1 1 6"; xmlText += ""; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(new System.IO.StringReader(xmlText)); foreach (XmlNode node in xmlDoc.SelectNodes("//Template")) { Console.WriteLine("{0}: {1}", node.Name, node.InnerText); } } 

您需要使用XmlNamespaceManager因为Template元素位于命名空间中:

 XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(new System.IO.StringReader(xmlText)); XmlNamespaceManager manager = new XmlNamespaceManager(xmlDoc.NameTable); manager.AddNamespace("ns", "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"); foreach (XmlNode node in xmlDoc.SelectNodes("//ns:Template", manager)) { Console.WriteLine("{0}: {1}", node.Name, node.InnerText); } 

这是命名空间问题; 您需要获取名称表,选择别名,并在查询中使用它。 或者(在这种情况下)尝试GetElementsByTagName

 XmlNamespaceManager mgr = new XmlNamespaceManager(xmlDoc.NameTable); mgr.AddNamespace("x", "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"); foreach (XmlNode node in xmlDoc.SelectNodes("//x:Template", mgr)) { Console.WriteLine("{0}: {1}", node.Name, node.InnerText); } 

要么:

 foreach (XmlNode node in xmlDoc.GetElementsByTagName("Template")) { Console.WriteLine("{0}: {1}", node.Name, node.InnerText); } 

这里xpath表达式需要命名空间解析。 您必须实例化XmlNamespaceManager并在SelectNodes中使用它。

这个样本应该有效

  public static void TestXPath() { string xmlText = ""; xmlText += ""; xmlText += " 1 1 6"; xmlText += ""; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(new System.IO.StringReader(xmlText)); XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDoc.NameTable); nsmgr.AddNamespace("res", "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"); foreach (XmlNode node in xmlDoc.SelectNodes("//res:Template", nsmgr)) { Console.WriteLine("{0}: {1}", node.Name, node.InnerText); } } 

您还可以通过使用和写入来获取默认命名空间

 string s = xmlDoc.DocumentElement.GetNamespaceOfPrefix(""); nsmgr.AddNamespace("ns", s); 

为什么你还需要命名空间呢? 只是摆脱这些

 xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\" xmlns:vt=\"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\" 

你的选择会奏效。