2014-01-26 4 views
-1

Я изо всех сил пытаюсь получить информацию из веб-службы REST. Я могу подключиться, но когда я пытаюсь проанализировать узел, всегда имеет значение null, даже с пространством имен:Получить информацию от REST API

Это XML, который я обрабатываю для синтаксического анализа, который я могу успешно загрузить в XML-документ.

<metadata xmlns="http://musicbrainz.org/ns/mmd-2.0#" xmlns:ext="http://musicbrainz.org/ns/ext#-2.0" created="2014-01-26T17:20:00.207Z"> 
    <artist-list count="1" offset="0"> 
     <artist id="65f4f0c5-ef9e-490c-aee3-909e7ae6b2ab" type="Group" ext:score="100"> 
      <name>Metallica</name> 
      <sort-name>Metallica</sort-name> 
      <country>US</country> 
      <area id="489ce91b-6658-3307-9877-795b68554c98"> 
       <name>United States</name> 
       <sort-name>United States</sort-name> 
      </area> 
      <begin-area id="1f40c6e1-47ba-4e35-996f-fe6ee5840e62"> 
       <name>Los Angeles</name> 
       <sort-name>Los Angeles</sort-name> 
      </begin-area> 
      <life-span> 
       <begin>1981-10</begin> 
       <ended>false</ended> 
      </life-span> 
      <alias-list> 
       <alias sort-name="メタリカ">メタリカ</alias> 
       <alias locale="ko_KR" sort-name="메탈리카" primary="primary">메탈리카</alias> 
       <alias sort-name="Metalica">Metalica</alias> 
      </alias-list> 
      <tag-list> 
       <tag count="1"> 
        <name>américain</name> 
       </tag> 
       <tag count="1"> 
        <name>usa</name> 
       </tag> 
       <tag count="2"> 
        <name>speed metal</name> 
       </tag> 
       <tag count="1"> 
        <name>douchebag metal</name> 
       </tag> 
       <tag count="1"> 
        <name>american thrash metal</name> 
       </tag> 
       <tag count="3"> 
        <name>rock</name> 
       </tag> 
       <tag count="1"> 
        <name>90s</name> 
       </tag> 
       <tag count="1"> 
        <name>80s</name> 
       </tag> 
       <tag count="1"> 
        <name>seen live</name> 
       </tag> 
       <tag count="1"> 
        <name>rock and indie</name> 
       </tag> 
       <tag count="10"> 
        <name>thrash metal</name> 
       </tag> 
       <tag count="6"> 
        <name>heavy metal</name> 
       </tag> 
       <tag count="1"> 
        <name>thrash</name> 
       </tag> 
       <tag count="10"> 
        <name>metal</name> 
       </tag> 
       <tag count="1"> 
        <name>classic thrash metal</name> 
       </tag> 
       <tag count="1"> 
        <name>classic metal</name> 
       </tag> 
       <tag count="1"> 
        <name>los angeles</name> 
       </tag> 
       <tag count="1"> 
        <name>california</name> 
       </tag> 
       <tag count="1"> 
        <name>bay area</name> 
       </tag> 
       <tag count="1"> 
        <name>80s metal</name> 
       </tag> 
       <tag count="1"> 
        <name>90s metal</name> 
       </tag> 
       <tag count="1"> 
        <name>80s thrash metal</name> 
       </tag> 
       <tag count="6"> 
        <name>american</name> 
       </tag> 
       <tag count="5"> 
        <name>hard rock</name> 
       </tag> 
       <tag count="1"> 
        <name>band</name> 
       </tag> 
      </tag-list> 
     </artist> 
    </artist-list> 
</metadata> 

Это то, что я до сих пор, но имя всегда нуль

XmlDocument doc = new XmlDocument(); 
      XPathNavigator nav = doc.CreateNavigator(); 
      XmlNamespaceManager man = new XmlNamespaceManager(doc.NameTable); 
      man.AddNamespace("ext", "http://musicbrainz.org/ns/ext#-2.0"); 
      doc.LoadXml(textXML); 
      XPathNavigator result = nav.SelectSingleNode("/ext:name", man); 
      Console.WriteLine(result); 

      // Wait for response 
      Console.WriteLine("If we get here it is blank"); 
      Console.ReadLine(); 

EDIT: Благодаря Гамлету я решил эту проблему с помощью Linq для XML, который имеет гораздо более хороший синтаксис. Для тех, кто заинтересован:

 // Define Namespaces and load XML 
     XNamespace def = "http://musicbrainz.org/ns/mmd-2.0#"; 
     XNamespace ext = "http://musicbrainz.org/ns/ext#-2.0"; 
     XElement root = XElement.Parse(textXML); 

     // Search for required Element 
     var elements = 
      root 
      .Descendants(def + "artist"); 

     // Print Results 
     foreach (var element in elements) 
     { 
      Console.Write(element.Value); 
     } 
+0

Вы определяете пространство имен с префиксом но пространства имен в XML без префикса. –

+0

Это XML. Он создается по этой ссылке: http://musicbrainz.org/ws/2/artist?query=%22metallica%22 –

ответ

1

Поскольку узел name в пространстве имен по умолчанию (без префикса пространства имен), вы должны ссылаться на использование XPath атрибута local-name().

Попробуйте это:

XmlDocument doc = new XmlDocument(); 
XPathNavigator nav = doc.CreateNavigator(); 
doc.LoadXml(textXML); 
XPathNavigator result = nav.SelectSingleNode("//*[local-name()='name']"); 
Console.WriteLine(result); 
+0

Спасибо! В конце концов я пошел с LINQ to XML, но ваш ответ поставил меня на правильный путь. –

+1

«LINQ2XML» является предпочтительной технологией, и я предлагаю использовать его, если это возможно. –

2

Как насчет использования JSON API этого сайта. Все, что вам нужно, это добавить &fmt=json к вашему URL и анализировать результат JSON с json.Net

using(var wc = new WebClient()) 
{ 
    string url = "http://musicbrainz.org/ws/2/artist?query=%22metallica%22&fmt=json"; 
    string json = wc.DownloadString(url); 
    var metadata = JsonConvert.DeserializeObject<Metadata>(json); 

    foreach(var artist in metadata.artists) 
    { 
     Console.WriteLine(artist.name); 
    } 
} 

public class Area 
{ 
    public string id { get; set; } 
    public string name { get; set; } 
    [JsonProperty("sort-name")] 
    public string sortname { get; set; } 
} 

public class BeginArea 
{ 
    public string id { get; set; } 
    public string name { get; set; } 
    [JsonProperty("sort-name")] 
    public string sortname { get; set; } 
} 

public class LifeSpan 
{ 
    public string begin { get; set; } 
    public object ended { get; set; } 
} 

public class Alias 
{ 
    [JsonProperty("sort-name")] 
    public string sortname { get; set; } 
    public string name { get; set; } 
    public string locale { get; set; } 
    public string type { get; set; } 
    public bool? primary { get; set; } 
    [JsonProperty("begin-date")] 
    public object begindate { get; set; } 
    [JsonProperty("end-date")] 
    public object enddate { get; set; } 
} 

public class Tag 
{ 
    public int count { get; set; } 
    public string name { get; set; } 
} 

public class Artist 
{ 
    public string id { get; set; } 
    public string type { get; set; } 
    public string score { get; set; } 
    public string name { get; set; } 

    [JsonProperty("sort-name")] 
    public string sortname { get; set; } 
    public string country { get; set; } 
    public Area area { get; set; } 
    [JsonProperty("begin-area")] 
    public BeginArea beginarea { get; set; } 
    [JsonProperty("life-span")] 
    public LifeSpan lifespan { get; set; } 
    public List<Alias> aliases { get; set; } 
    public List<Tag> tags { get; set; } 
} 

public class Metadata 
{ 
    public string created { get; set; } 
    public int count { get; set; } 
    public int offset { get; set; } 
    [JsonProperty("artist")] 
    public List<Artist> artists { get; set; } 
} 
Смежные вопросы