2014-02-12 4 views
5

У меня есть этот XML-строка:XDocument.Element возвращает нуль при разборе строки XML

<a:feed xmlns:a="http://www.w3.org/2005/Atom" 
     xmlns:os="http://a9.com/-/spec/opensearch/1.1/" 
     xmlns="http://schemas.zune.net/catalog/apps/2008/02"> 
    <a:link rel="self" type="application/atom+xml" href="/docs" /> 
    <a:updated>2014-02-12</a:updated> 
    <a:title type="text">Chickens</a:title> 
    <a:content type="html">eat 'em all</a:content> 
    <sortTitle>Chickens</sortTitle> 
    ... other stuffs 
    <offers> 
     <offer> 
      <offerId>8977a259e5a3</offerId> 
      ... other stuffs 
      <price>0</price> 
      ... other stuffs 
     </offer> 
    </offers> 
    ... other stuffs 
</a:feed> 

и хочу получить значение <price> но здесь в моих кодах:

XDocument doc = XDocument.Parse(xmlString); 
var a = doc.Element("a"); 
var offers = a.Element("offers"); 
foreach (var offer in offers.Descendants()) 
{ 
    var price = offer.Element("price"); 
    var value = price.Value; 
} 

doc.Element("a"); возвращается ноль. Я попытался удалить эту строку offers также null. что не так в моем коде и как получить значение price? благодаря

+1

Является 'а' вашим пространством имен? –

+0

благодарит за вас – user3293835

ответ

5

Получить пространство имен так или иначе, как

XNameSpace a = doc.Root.GetDefaultNamespace();

или, вероятно, лучше:

XNameSpace a = doc.Root.GetNamespaceOfPrefix("a"); 

, а затем использовать его в своих запросах:

// to get <a:feed> 
XElement f = doc.Element(a + "feed"); 

Вы также можете задать пространство имен из строки литерала, но затем избегайте var.

+1

По умолчанию пространство имен "http://schemas.zune.net/catalog/apps/2008/02", которое не является пространством имен 'a'. – Dirk

+0

Да, у меня были проблемы с прокруткой ... –

2

a - это пространство имен. Для того, чтобы получить элемент подачи попробовать это:

XDocument doc = XDocument.Parse(xmlString); 
XNamespace a = "http://www.w3.org/2005/Atom"; 
var feed = doc.Element(a + "feed"); 
4

Вот правильный способ получить цены:

var xdoc = XDocument.Parse(xmlString); 
XNamespace ns = xdoc.Root.GetDefaultNamespace(); 

var pricres = from o in xdoc.Root.Elements(ns + "offers").Elements(ns + "offer") 
       select (int)o.Element(ns + "price"); 

Имейте в виду, что документ есть пространство имен по умолчанию, и a также пространство имен.

2
var xDoc = XDocument.Load(filename); 
XNamespace ns = "http://schemas.zune.net/catalog/apps/2008/02"; 
var prices = xDoc 
       .Descendants(ns + "offer") 
       .Select(o => (decimal)o.Element(ns + "price")) 
       .ToList(); 
Смежные вопросы