2009-08-01 2 views
2

Предположим, у меня есть следующий XML-документ, как получить значение элемента для имени: (в моем примере значение равно субботе 100)? Моя путаница заключается в том, как иметь дело с пространством имен. Благодарю.вопрос, чтобы получить конкретное значение элемента XML, используя C#

Я использую 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> 

ответ

4

Это проще, если вы используете LINQ для классов 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); 
+0

К сожалению, я должен быть связанный с .Net 2.0. Любое решение для этого? – George2

+0

Спасибо aquinas, ваше решение работает! – George2

5

Используйте 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); 
      } 
     } 
+0

Спасибо adatapost, я предпочитаю использовать XPATH, поскольку он более стабилен и прост в обслуживании, предположим, что я могу изменить формат XML-запроса и ответа в будущем. – George2

3

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; 
+0

Спасибо, Стив, ваше решение работает! – George2

Смежные вопросы