如何使用XPath与XDocument?

有一个类似的问题,但似乎解决scheme没有在我的情况下工作: 与XDocument,XPath和命名空间的古怪

这是我正在使用的XML:

<?xml version="1.0" encoding="utf-8"?> <Report Id="ID1" Type="Demo Report" Created="2011-01-01T01:01:01+11:00" Culture="en" xmlns="http://demo.com/2011/demo-schema"> <ReportInfo> <Name>Demo Report</Name> <CreatedBy>Unit Test</CreatedBy> </ReportInfo> </Report> 

下面是我认为它应该工作的代码,但它没有…

 XDocument xdoc = XDocument.Load(@"C:\SampleXML.xml"); XmlNamespaceManager xnm = new XmlNamespaceManager(new NameTable()); xnm.AddNamespace(String.Empty, "http://demo.com/2011/demo-schema"); Console.WriteLine(xdoc.XPathSelectElement("/Report/ReportInfo/Name", xnm) == null); 

有没有人有任何想法? 谢谢。

如果你有XDocument,那么使用LINQ to XML更容易:

 var document = XDocument.Load(fileName); var name = document.Descendants(XName.Get("Name", @"http://demo.com/2011/demo-schema")).First().Value; 

如果您确定XPath是您需要的唯一解决scheme:

 using System.Xml.XPath; var document = XDocument.Load(fileName); var namespaceManager = new XmlNamespaceManager(new NameTable()); namespaceManager.AddNamespace("empty", "http://demo.com/2011/demo-schema"); var name = document.XPathSelectElement("/empty:Report/empty:ReportInfo/empty:Name", namespaceManager).Value; 

XP实现的是XP,它没有默认的命名空间。 所以试试这个:

 XDocument xdoc = XDocument.Load(@"C:\SampleXML.xml"); XmlNamespaceManager xnm = new XmlNamespaceManager(new NameTable()); xnm.AddNamespace("x", "http://demo.com/2011/demo-schema"); Console.WriteLine(xdoc.XPathSelectElement("/x:Report/x:ReportInfo/x:Name", xnm) == null);