使用 XML 从 Element 获取值
Getting value from Element with XML
我可以从 XML 中获取 header 属性,但我想提取标题,该标题向下几个节点。我在代码中留下了我最近的尝试。
FirstAttributes 工作所以我知道我正在连接,如果我 return 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# extracting data from XML
您可以执行以下操作。
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#"
尝试以下操作:
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; }
}
}
我可以从 XML 中获取 header 属性,但我想提取标题,该标题向下几个节点。我在代码中留下了我最近的尝试。 FirstAttributes 工作所以我知道我正在连接,如果我 return 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# extracting data from XML
您可以执行以下操作。
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#"
尝试以下操作:
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; }
}
}