Предположим, у меня есть следующий документ XML, как получить значение элемента для a: name (в моем примере это значение Saturday 100)? Моя путаница заключается в том, как бороться с пространством имен. Спасибо.
Я использую C # и VSTS 2008.
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <PollResponse xmlns="http://tempuri.org/"> <PollResult xmlns:a="http://schemas.datacontract.org/2004/07/FOO.WCF" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <a:name>Saturday 100</a:name> </PollResult> </PollResponse> </s:Body> </s:Envelope>
Использовать класс System.Xml.XmlTextReader,
System.Xml.XmlTextReader xr = new XmlTextReader(@"file.xml"); while (xr.Read()) { if (xr.LocalName == "name" && xr.Prefix == "a") { xr.Read(); Console.WriteLine(xr.Value); } }
Проще, если вы используете классы LINQ to XML. Иначе пространства имен действительно раздражают.
XNamespace ns = "http://schemas.datacontract.org/2004/07/FOO.WCF"; var doc = XDocument.Load("C:\\test.xml"); Console.Write(doc.Descendants(ns + "name").First().Value);
Редактировать. Используя 2.0
XmlDocument doc = new XmlDocument(); doc.Load("C:\\test.xml"); XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable); ns.AddNamespace("a", "http://schemas.datacontract.org/2004/07/FOO.WCF"); Console.Write(doc.SelectSingleNode("//a:name", ns).InnerText);
XPath - это прямой путь к битам XML-документа в 2.0
XmlDocument xml = new XmlDocument(); xml.Load("file.xml") XmlNamespaceManager manager = new XmlNamespaceManager(xml.NameTable); manager.AddNamespace("a", "http://schemas.datacontract.org/2004/07/FOO.WCF"); string name = xml.SelectSingleNode("//a:name", manager).InnerText;