Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

XPath and attributes

Tags:

c#

.net

xml

xpath

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?

like image 610
mike Avatar asked Mar 27 '26 21:03

mike


2 Answers

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

xn.SelectSingleNode("info/@resolution").Value
like image 127
Kirill Polishchuk Avatar answered Mar 31 '26 05:03

Kirill Polishchuk


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);
}
like image 39
k.m Avatar answered Mar 31 '26 04:03

k.m



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!