Welcome!

Industrial IoT Authors: Yeshim Deniz, Liz McMillan, Pat Romanski, Kevin Benedict, Elizabeth White

Blog Feed Post

Android to Windows 8: Parse XML data

It’s more than likely that a Windows Store app will need to work with data that resides on the Internet. For example, an app may aggregate data from various news sources using RSS feeds. Consuming this type of data in a Windows Store app is very similar to consuming it in an Android app. In this post I’ll show you how parse XML data from a feed on StackOverflow.

The first thing you’ll need to do is decide on an XML feed you want to use in your app. For this section will use a feed from StackOverflow.com that focuses on Windows 8. The feed is available at http://stackoverflow.com/feeds/tag/windows-8.

Once you’ve identified the feed you’ll want to analyze it to determine which fields are of interest to your app. Below is a sample abstract form the StackOverflow.com feed we’ll be using:

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:re="http://purl.org/atompub/rank/1.0">
<title type="text">active questions tagged windows-8 - Stack Overflow</title>
 ...
 <entry>
 ...
 </entry>
 <entry>
  <id>http://stackoverflow.com/q/00000000</id>
  <re:rank scheme="http://stackoverflow.com">0</re:rank>
  <title type="text">Windows Store XML Data</title>
  <category scheme="http://stackoverflow.com/feeds/tag/windows-8/tags" term="c#"/>
  <category scheme="http://stackoverflow.com/feeds/tag/windows-8/tags" term="xml"/>
  <category scheme="http://stackoverflow.com/feeds/tag/windows-8/tags" term="windows-8"/>
  <category scheme="http://stackoverflow.com/feeds/tag/windows-8/tags" term="windows-runtime"/>
  <author>
   <name>anonymous</name>
   <uri>http://stackoverflow.com/users/000000</uri>
  </author>
  <link rel="alternate" href="http://stackoverflow.com/questions/00000000/windows-store-xml-data" />
  <published>1900-01-01T00:00:00Z</published>
  <updated>1900-01-01T00:00:00Z</updated>
  <summary type="html">
   <p>How do I use XML in Windows Store apps?</p>
  </summary>
 </entry>
 <entry>
 ...
 </entry>
 ...
</feed>

For the example, we’ll focus on the title, link, and summary elements. The first step is to create a class that represents the data you want to work with in your app. Since we’re focusing on the title, link, and summary elements of the feed, the class will look like the following:

public class FeedEntry
{
 public string Title { get; set; }
 public string Link { get; set; }
 public string Summary { get; set; }
}

The next step is to create a class and a method that will be responsible for the parsing. The return type of the method should be a list of FeedEntry objects. A possibility would look like this:

public class StackOverflowXmlParser
{
 ...
 public async Task<List<FeedEntry>> Parse()
 {
  ...
 }
 ...
}

Notice that the async modifier has been added to the method and the method is return a Task which has been typed as a list of FeedEntry objects. This allows the method to use the await operator to designate suspension points. The await operator tells the compiler that the async method can’t continue past that point until the awaited asynchronous operation is complete. Additionally, this makes it very easy for calling methods to call the Parse method in an asynchronous manner by simply using the await keyword.

Android tip
Usage of the async modifier and the await operator in Windows 8 to simplify asynchronous programming is similar to the use of the AsyncTask class in Android developer

The first task in the Parse method will be to instantiate a result set to return to the calling method and check the status of network connectivity using the GetConnectionState method described in the previous section. Because this could be dealing with a large amount of data, we’ll want to make sure that we only try to access the feed if the device is on a non-metered connection:

List<FeedEntry> results = new List<FeedEntry>();

//Determine connection state
var connectionState = GetConnectionState();

//Proceed if a non-metered connection is detected
if (connectionState == ConnectionState.NonMetered)
{
 ...

The next thing to do is to determine the method by which the feed will be processed. Because we’re dealing with an XML feed, we have three options in .NET:

  1. The System.Xml namespace
  2. The System.Xml.Linq namespace
  3. The System.ServiceModel.Syndication namespace

The System.Xml namespace provides standards-based support for processing XML. It gives you quite a bit of control over how you process XML and allows you to use things like XSD schemas, XPath expressions, and XSLT transformations. It’s a little more power than we need for this particular task. The SyndicationFeed class in the System.ServiceModel.Syndication namespace would actually make our job incredibly simple if we wanted work with all of the fields in the feed. However, since we’re only concerned with three fields we’ll use the System.Xml.Linq namespace. This namespace contains the classes for LINQ (Language INtegrated Query) to XML which serves as an in-memory XML programming interface that enables easy and efficient processing of XML documents.

First up when working with LINQ to XML is to create some XName objects that represent the names of the elements we want to work with. These names need to include the local and namespace names.

//Atom namespace
var atomNamespace = "http://www.w3.org/2005/Atom";

//Create the names of the XML elements including the Atom namespace
var entryXName = XName.Get("entry", atomNamespace);
var titleXName = XName.Get("title", atomNamespace);
var linkXName = XName.Get("link", atomNamespace);
var summaryXName = XName.Get("summary", atomNamespace);

The next step is to load the XML data into an XElement class asynchronously. To do this, create an HttpWebRequest instance and call its GetResponseAsync() method using the await keyword. The GetResponseStream() of the HttpWebResponse object can then be used in the Load(…) method of the XElement class.

//Load the XML data asynchronously
var request = HttpWebRequest.CreateHttp("http://stackoverflow.com/feeds/tag/windows-8");
var response = await request.GetResponseAsync();
XElement root = XElement.Load(response.GetResponseStream());

 

Android tip
This is similar to using Android’s HttpURLConnection to retrieve and InputStream

private InputStream downloadXml() throws IOException {
 URL url = new URL('http://stackoverflow.com/feeds/tag/windows-8');
 HttpURLConnection conn = (HttpURLConnection) url.openConnection();
 conn.setRequestMethod("GET");
 conn.setDoInput(true);
 conn.connect();
 return conn.getInputStream();
}

You would then use the InputStream output as an input parameter into the XmlPullParser class’s setInput method.

Once the XElement object is loaded, we can use LINQ to query for just the entry elements and in the XElement and store them in a list:

//Load all "entry" elements from the XML into a list
var entries = (from e in root.Elements(entryXName) select e).ToList();

Next we’ll start iterating through the list of entries. The first step in the iteration is to instantiate a new FeedEntry object:

//Iterate all "entry" elements
foreach (var entry in entries)
{
 //Create a new FeedEntry
 var feedEntry = new FeedEntry();
 ...
}

Then we’ll assign the value of the FeedEntry’s Title property to the value of the title element:

//Get the title
var titleElement = (from e in entry.Elements(titleXName) select e).FirstOrDefault();

if (titleElement != null)
 feedEntry.Title = titleElement.Value;
Android tip
The Android equivalent would be calling the getText() method of the XmlPullParser class to get the value of the current element.

Similarly we’ll assign the value of the Link property to the value of the link element’s href attribute:

//Get the link
var linkElement = (from e in entry.Elements(linkXName) select e).FirstOrDefault();

if (linkElement != null)
{
 var hrefAttribute = linkElement.Attributes("href").FirstOrDefault();

 if (hrefAttribute != null)
  feedEntry.Link = hrefAttribute.Value;
}
Android tip
To get the attribute value in Android you would use the getAttribueValue() method of the XmlPullParser class.

Next we’ll assign the value of the Summary property to the value of the summary element and add the object to the result set to be returned to the calling method:

//Add to the entry to the result set
results.Add(feedEntry);

The last step is to call the Parse method. Since the Parse method was modified with the async keyword, it can be called asynchronously by using the await operator like so:

var parser = new StackOverflowXmlParser();
var entries = await parser.Parse();
//do something with the entries

Read the original blog entry...

More Stories By Adam Grocholski

Hey there! My name is Adam Grocholski, and I'm a Technical Evangelist at Microsoft where I spend time focusing on Windows, Windows Phone, and Windows Azure. I live in the frozen tundra of Minnesota and run thinkfirstcodelater.com. You can also follow me on twitter at @codel8r.

@ThingsExpo Stories
Amazon started as an online bookseller 20 years ago. Since then, it has evolved into a technology juggernaut that has disrupted multiple markets and industries and touches many aspects of our lives. It is a relentless technology and business model innovator driving disruption throughout numerous ecosystems. Amazon’s AWS revenues alone are approaching $16B a year making it one of the largest IT companies in the world. With dominant offerings in Cloud, IoT, eCommerce, Big Data, AI, Digital Assista...
Organizations planning enterprise data center consolidation and modernization projects are faced with a challenging, costly reality. Requirements to deploy modern, cloud-native applications simultaneously with traditional client/server applications are almost impossible to achieve with hardware-centric enterprise infrastructure. Compute and network infrastructure are fast moving down a software-defined path, but storage has been a laggard. Until now.
Digital Transformation is much more than a buzzword. The radical shift to digital mechanisms for almost every process is evident across all industries and verticals. This is often especially true in financial services, where the legacy environment is many times unable to keep up with the rapidly shifting demands of the consumer. The constant pressure to provide complete, omnichannel delivery of customer-facing solutions to meet both regulatory and customer demands is putting enormous pressure on...
In his general session at 19th Cloud Expo, Manish Dixit, VP of Product and Engineering at Dice, discussed how Dice leverages data insights and tools to help both tech professionals and recruiters better understand how skills relate to each other and which skills are in high demand using interactive visualizations and salary indicator tools to maximize earning potential. Manish Dixit is VP of Product and Engineering at Dice. As the leader of the Product, Engineering and Data Sciences team at D...
DXWorldEXPO LLC announced today that All in Mobile, a mobile app development company from Poland, will exhibit at the 22nd International CloudEXPO | DXWorldEXPO. All In Mobile is a mobile app development company from Poland. Since 2014, they maintain passion for developing mobile applications for enterprises and startups worldwide.
"Akvelon is a software development company and we also provide consultancy services to folks who are looking to scale or accelerate their engineering roadmaps," explained Jeremiah Mothersell, Marketing Manager at Akvelon, in this SYS-CON.tv interview at 21st Cloud Expo, held Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA.
IoT is at the core or many Digital Transformation initiatives with the goal of re-inventing a company's business model. We all agree that collecting relevant IoT data will result in massive amounts of data needing to be stored. However, with the rapid development of IoT devices and ongoing business model transformation, we are not able to predict the volume and growth of IoT data. And with the lack of IoT history, traditional methods of IT and infrastructure planning based on the past do not app...
DXWorldEXPO LLC announced today that the upcoming DXWorldEXPO | CloudEXPO New York event will feature 10 companies from Poland to participate at the "Poland Digital Transformation Pavilion" on November 12-13, 2018.
22nd International Cloud Expo, taking place June 5-7, 2018, at the Javits Center in New York City, NY, and co-located with the 1st DXWorld Expo will feature technical sessions from a rock star conference faculty and the leading industry players in the world. Cloud computing is now being embraced by a majority of enterprises of all sizes. Yesterday's debate about public vs. private has transformed into the reality of hybrid cloud: a recent survey shows that 74% of enterprises have a hybrid cloud ...
@DevOpsSummit at Cloud Expo, taking place November 12-13 in New York City, NY, is co-located with 22nd international CloudEXPO | first international DXWorldEXPO and will feature technical sessions from a rock star conference faculty and the leading industry players in the world.
More and more brands have jumped on the IoT bandwagon. We have an excess of wearables – activity trackers, smartwatches, smart glasses and sneakers, and more that track seemingly endless datapoints. However, most consumers have no idea what “IoT” means. Creating more wearables that track data shouldn't be the aim of brands; delivering meaningful, tangible relevance to their users should be. We're in a period in which the IoT pendulum is still swinging. Initially, it swung toward "smart for smart...
As data explodes in quantity, importance and from new sources, the need for managing and protecting data residing across physical, virtual, and cloud environments grow with it. Managing data includes protecting it, indexing and classifying it for true, long-term management, compliance and E-Discovery. Commvault can ensure this with a single pane of glass solution – whether in a private cloud, a Service Provider delivered public cloud or a hybrid cloud environment – across the heterogeneous enter...
DXWorldEXPO LLC announced today that ICC-USA, a computer systems integrator and server manufacturing company focused on developing products and product appliances, will exhibit at the 22nd International CloudEXPO | DXWorldEXPO. DXWordEXPO New York 2018, colocated with CloudEXPO New York 2018 will be held November 11-13, 2018, in New York City. ICC is a computer systems integrator and server manufacturing company focused on developing products and product appliances to meet a wide range of ...
Michael Maximilien, better known as max or Dr. Max, is a computer scientist with IBM. At IBM Research Triangle Park, he was a principal engineer for the worldwide industry point-of-sale standard: JavaPOS. At IBM Research, some highlights include pioneering research on semantic Web services, mashups, and cloud computing, and platform-as-a-service. He joined the IBM Cloud Labs in 2014 and works closely with Pivotal Inc., to help make the Cloud Found the best PaaS.
Headquartered in Plainsboro, NJ, Synametrics Technologies has provided IT professionals and computer systems developers since 1997. Based on the success of their initial product offerings (WinSQL and DeltaCopy), the company continues to create and hone innovative products that help its customers get more from their computer applications, databases and infrastructure. To date, over one million users around the world have chosen Synametrics solutions to help power their accelerated business or per...
Dion Hinchcliffe is an internationally recognized digital expert, bestselling book author, frequent keynote speaker, analyst, futurist, and transformation expert based in Washington, DC. He is currently Chief Strategy Officer at the industry-leading digital strategy and online community solutions firm, 7Summits.
In an era of historic innovation fueled by unprecedented access to data and technology, the low cost and risk of entering new markets has leveled the playing field for business. Today, any ambitious innovator can easily introduce a new application or product that can reinvent business models and transform the client experience. In their Day 2 Keynote at 19th Cloud Expo, Mercer Rowe, IBM Vice President of Strategic Alliances, and Raejeanne Skillern, Intel Vice President of Data Center Group and ...
Founded in 2000, Chetu Inc. is a global provider of customized software development solutions and IT staff augmentation services for software technology providers. By providing clients with unparalleled niche technology expertise and industry experience, Chetu has become the premiere long-term, back-end software development partner for start-ups, SMBs, and Fortune 500 companies. Chetu is headquartered in Plantation, Florida, with thirteen offices throughout the U.S. and abroad.
In his Opening Keynote at 21st Cloud Expo, John Considine, General Manager of IBM Cloud Infrastructure, led attendees through the exciting evolution of the cloud. He looked at this major disruption from the perspective of technology, business models, and what this means for enterprises of all sizes. John Considine is General Manager of Cloud Infrastructure Services at IBM. In that role he is responsible for leading IBM’s public cloud infrastructure including strategy, development, and offering m...
From 2013, NTT Communications has been providing cPaaS service, SkyWay. Its customer’s expectations for leveraging WebRTC technology are not only typical real-time communication use cases such as Web conference, remote education, but also IoT use cases such as remote camera monitoring, smart-glass, and robotic. Because of this, NTT Communications has numerous IoT business use-cases that its customers are developing on top of PaaS. WebRTC will lead IoT businesses to be more innovative and address...