使用C#在XML文档中查找特定值的好方法是什么?

我正在调用Oracle公开的WebService,它接受ItemID的输入并返回相应的Item Number。 我想获取已从响应中包含的XML返回的Item Number。

XML看起来像这样:

      1010603    

我只想抓取1010603特别是只抓取1010603。

我没有做过很多使用C#解析XML的工作,到目前为止我正在使用一些不同的方法。 建议的方法是什么?

我在VS2008上(所以XPath可用等)

我个人使用LINQ to XML,因为我发现比XPath更容易处理,特别是涉及名称空间时。 你会做类似的事情:

 XNamespace ns0 = "http://dev1/MyWebService1.wsdl"; String result = doc.Descendants(ns0 + "result").First().Value; 

请注意,此处的doc应该是XDocument而不是 XmlDocument 。 (我的猜测是,这就是为什么它没有出现在你面前。)

fwiw你可以用这样的xpath来欺骗命名空间问题: //*[local-name()='result']

如果您不想使用Linq,可以使用XPathDocument来检索值:

 XPathDocument xmldoc = new XPathDocument(@"C:\tmp\sample.xml"); XPathNavigator nav = xmldoc.CreateNavigator(); XmlNamespaceManager nsMgr = new XmlNamespaceManager(nav.NameTable); nsMgr.AddNamespace("ns0", "http://dev1/MyWebService1.wsdl"); XPathNavigator result = nav.SelectSingleNode("//ns0:result", nsMgr); System.Diagnostics.Debug.WriteLine(result.Value); 

XPathDocument具有较低的内存占用,并且在您的方案中最有可能比XmlDocument更快。 XmlDocument在内存中构建XML文档的完整对象模型,而XPathDocument不这样做。

在我的头顶,以下应该工作:

 XmlDocument doc = new XmlDocument(); doc.PreserveWhitespace = true; XmlNamespaceManager mgr = GetNamespace(doc); doc.LoadXml(xmltext); XmlNode nd = doc.DocumentElement.SelectSingleNode("//ns0:result", mgr); 

命名空间代码如下所示:

 private XmlNamespaceManager GetNamespace(XmlDocument document) { XmlNamespaceManager mgr = new XmlNamespaceManager(document.NameTable); mgr.AddNamespace("ns0", "http://dev1/MyWebService1.wsdl"); return mgr; } 

您需要使用命名空间管理器,因为XML文档具有与之关联的命名空间,XPath在查询解析中使用它。

为了解决这个问题,我使用了Jon Skeet的答案。 这是我必须实现的代码才能使这项工作(为了其他人的未来利益)。

 XmlDocument xmlDoc = new XmlDocument(); XNamespace ns0 = "http://dev1/MyWebService1.wsdl"; xmlDoc.Load(request.GetResponse().GetResponseStream()); XDocument xDoc = XDocument.Load(new XmlNodeReader(xmlDoc)); String result = xDoc.Descendants(ns0 + "result").First().Value; 

这当然假设我从HttpWebRequest命名请求中得到了我的响应。

这个问题有非常好的和完整的答案。

只是出于好奇而添加了一个非常简单的XPath表达式来完成这个特殊情况的工作

normalize-space(/)

这可以在C#中使用类似下面两行的内容轻松完成:

  XPathNavigator navigator = document.CreateNavigator(); string res = (string)navigator.Evaluate("normalize-space(/)"); 

通过.NET XPath引擎的良好优化,其评估甚至可能是高效的。