mike
mike

Reputation: 147

XPath and attributes

I'm trying to traverse an XML document and select certain node attributes. The XML is dynamically generated.

<?xml version="1.0" encoding="ISO-8859-1"?>
<streams>
<stream>
<title>+23 (Panama)</title>
<info resolution="768x420" bitrate="1000kbps"/> ----- Need These
<swfUrl>http://www.freeetv.com/script/mediaplayer/player.swf</swfUrl>
<link>rtmp://200.75.216.156/live/</link>
<pageUrl>http://www.freeetv.com/</pageUrl>
<playpath>livestream</playpath>
<language>Music</language>
<advanced></advanced>
</stream>
</streams>

The code that I'm trying to use with zero luck and Visual Studio saying "No you're wrong. Try 600 more times" is

xDoc.Load("http://127.0.0.1/www/xml.php");

                XmlNodeList nodes = xDoc.SelectNodes("/streams/stream");
                foreach (XmlNode xn in nodes)
                {
                    ListViewItem lvi = listView1.Items.Add(xn["title"].InnerText);
                    lvi.SubItems.Add(xn["swfUrl"].InnerText);
                    lvi.SubItems.Add(xn["link"].InnerText);
                    lvi.SubItems.Add(xn["pageUrl"].InnerText);
                    lvi.SubItems.Add(xn["playpath"].InnerText);
                    lvi.SubItems.Add(xn["language"].InnerText);
                    lvi.SubItems.Add(xn["advanced"].InnerText);
                    lvi.SubItems.Add(xn["//info/@resolution"].Value);
                }

Please tell me oh wise ones what am I doing wrong?

Upvotes: 3

Views: 529

Answers (4)

Dimitre Novatchev
Dimitre Novatchev

Reputation: 243449

Replace:

lvi.SubItems.Add(xn["//info/@resolution"].Value); 

with:

lvi.SubItems.Add(xn.SelectSingleNode("info/@resolution").Value); 

Upvotes: 0

Despertar
Despertar

Reputation: 22362

Here is an example of LINQ to XML to extract attributes from the entire document of a particular attribute name OR list of attribute names.

var xml = XElement.Parse("http://127.0.0.1/www/xml.php");

// find all attributes of a given name
var attributes = xml
     .Descendants()
     .Attributes("AttributeName")

// find all attributes of multiple names
var attributes = xml
    .Descendants()
    .Attributes()
    .Where(a => ListOfAttribNames.Contains(a.Name.LocalName))

Upvotes: 1

k.m
k.m

Reputation: 31454

To select resolution attribute of your last node you need to use:

xn["info"].Attributes["resolution"].Value

Alternatively, you can try LINQ to XML for the same results (I find its API easier to use):

var doc = XDocument.Parse("http://127.0.0.1/www/xml.php");

foreach (var d in doc.Descendants("stream"))
{
    ListViewItem lvi = listView1.Items.Add(d.Element("title").Value);
    lvi.SubItems.Add(d.Element("swfUrl").Value);
    // ...
    vi.SubItems.Add(d.Element("info").Attribute("resolution").Value);
}

Upvotes: 2

Kirill Polishchuk
Kirill Polishchuk

Reputation: 56162

If you want to select node's attribute using XPath you should use SelectSingleNode method, e.g.:

xn.SelectSingleNode("info/@resolution").Value

Upvotes: 3

Related Questions