Получение значения от элемента с XML - PullRequest
0 голосов
/ 12 января 2020

Я могу получить атрибуты заголовка из XML, но хочу извлечь заголовок, который находится на несколько узлов ниже. Я оставил свою последнюю попытку в коде. FirstAttributes работают, поэтому я знаю, что я подключаюсь, и если я возвращаю Console.WriteLine (e), я получаю полный XML.

var url = "http://musicbrainz.org/ws/2/release-group/?query=artist:%22coldplay%22%20AND%20primarytype:%22single%22";

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.UserAgent = "Hello World Super Script";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
XDocument doc = XDocument.Load(response.GetResponseStream());

IEnumerable<XElement> childList =
from el in doc.Elements()  
select el; 
//title is element we need  
foreach (XElement e in childList)  
Console.WriteLine("{0} {1} {2}", e.FirstAttribute, e.FirstAttribute.NextAttribute, e.Element("release-group").Attribute("title")); 

Исследовано: C# извлечение данных из XML

Ответы [ 2 ]

1 голос
/ 12 января 2020

Попробуйте следующее:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Net;

namespace ConsoleApplication1
{
    class Program
    {
        const string URL = @"http://musicbrainz.org/ws/2/release-group/?query=artist:%22coldplay%22%20AND%20primarytype:%22single%22";
        static void Main(string[] args)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
            request.UserAgent = "Hello World Super Script";
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            XDocument doc = XDocument.Load(response.GetResponseStream());
            XNamespace ns = doc.Root.GetDefaultNamespace();

            List<Group> groups = doc.Descendants(ns + "release-group").Select(x => new Group()
            {
                title = (string)x.Element(ns + "title"),
                name = (string)x.Descendants(ns + "name").FirstOrDefault(),
                releaseTitles = x.Element(ns + "release-list").Descendants(ns + "title").Select(y => (string)y).ToArray()
            }).ToList();
        }
    }
    public class Group
    {
        public string title { get; set; }
        public string name { get; set; }
        public string[] releaseTitles { get; set; }
    }
}
1 голос
/ 12 января 2020

Вы можете сделать следующее.

var doc = XDocument.Load(response.GetResponseStream());
XNamespace ns = "http://musicbrainz.org/ns/mmd-2.0#";

var titleList = doc.Descendants(ns + "title");
foreach (var element in titleList) 
    Console.WriteLine(element.Value);

XDocument.Descendants() позволяет искать дочерний узел с указанным именем. Обратите внимание, что вам нужно указать пространство имен вместе с именем элемента.

Если вы наблюдаете ответ от WebRequest, вы можете найти подробную информацию о пространстве имен.

xmlns="http://musicbrainz.org/ns/mmd-2.0#" 

Пример Demo

...