SelectNodes give the empty node even if the xml Contains the node - c#

XPathNavigator nav = xmlDoc.CreateNavigator();
XmlNamespaceManager nsMgr = new XmlNamespaceManager(nav.NameTable);
nsMgr.AddNamespace(string.Empty,#"http://www.w3.org/2005/Atom");
nsMgr.AddNamespace("dxp",#"http://schemas.google.com/analytics/2009");
nsMgr.AddNamespace("openSearch",#"http://a9.com/-/spec/opensearch/1.1/");
XmlNodeList nodeList = xmlDoc.SelectNodes("entry",nsMgr); // nodeList is empty why?
After execution of above code nodeList is empty
But when I see the XMLDocument it contains the the required Nodes entry
Here is the the XMLDocument innerXML
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dxp="http://schemas.google.com/analytics/2009" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/">
<id>https://www.googleapis.com/analytics/v2.4/data?ids=ga:63294209&dimensions=ga:visitorType&metrics=ga:visitors&start-date=2012-10-06&end-date=2012-11-06</id>
<updated>2012-11-06T10:04:40.613Z</updated>
<title type="text">Google Analytics Data for Profile 63294209</title>
<link rel="self" type="application/atom+xml" href="https://www.googleapis.com/analytics/v2.4/data?ids=ga:63294209&dimensions=ga:visitorType&metrics=ga:visitors&start-date=2012-10-06&end-date=2012-11-06" />
<author>
<name>Google Analytics</name>
</author>
<generator>Google Analytics</generator>
<openSearch:totalResults>2</openSearch:totalResults>
<openSearch:startIndex>1</openSearch:startIndex>
<openSearch:itemsPerPage>1000</openSearch:itemsPerPage>
<dxp:aggregates>
<dxp:metric name="ga:visitors" type="integer" value="6709" />
</dxp:aggregates>
<dxp:containsSampledData>false</dxp:containsSampledData>
<dxp:dataSource>
<dxp:property name="ga:profileId" value="63294209" />
<dxp:property name="ga:webPropertyId" value="UA-34279407-1" />
<dxp:property name="ga:accountName" value="The Federal Savings Bank" />
<dxp:tableId>ga:63294209</dxp:tableId>
<dxp:tableName>The Federal Savings Bank</dxp:tableName>
</dxp:dataSource>
<dxp:endDate>2012-11-06</dxp:endDate>
<dxp:startDate>2012-10-06</dxp:startDate>
<entry>
<id>https://www.googleapis.com/analytics/v2.4/data?ids=ga:63294209&ga:visitorType=New+Visitor&start-date=2012-10-06&end-date=2012-11-06</id>
<updated>2012-11-06T10:04:40.613Z</updated>
<title type="text">ga:visitorType=New Visitor</title>
<link rel="alternate" type="text/html" href="http://www.google.com/analytics" />
<dxp:dimension name="ga:visitorType" value="New Visitor" />
<dxp:metric name="ga:visitors" type="integer" value="5240" />
</entry>
<entry>
<id>https://www.googleapis.com/analytics/v2.4/data?ids=ga:63294209&ga:visitorType=Returning+Visitor&start-date=2012-10-06&end-date=2012-11-06</id>
<updated>2012-11-06T10:04:40.613Z</updated>
<title type="text">ga:visitorType=Returning Visitor</title>
<link rel="alternate" type="text/html" href="http://www.google.com/analytics" />
<dxp:dimension name="ga:visitorType" value="Returning Visitor" />
<dxp:metric name="ga:visitors" type="integer" value="1469" />
</entry>
</feed>

There's a known issue in .NET with the default XML namespace - contrary to what is defined in the XML standards, in .NET you cannot use a string.Empty as the prefix - you need to use something else.
Try this:
XPathNavigator nav = xmlDoc.CreateNavigator();
XmlNamespaceManager nsMgr = new XmlNamespaceManager(nav.NameTable);
nsMgr.AddNamespace("def", #"http://www.w3.org/2005/Atom"); <== Give this a prefix!
nsMgr.AddNamespace("dxp", #"http://schemas.google.com/analytics/2009");
nsMgr.AddNamespace("openSearch", #"http://a9.com/-/spec/opensearch/1.1/");
XmlNodeList nodeList = xmlDoc.SelectNodes("/def:feed/def:entry", nsMgr);
Now, this list does have two nodes in it - right?

Related

How to write xpath for xml with two namespaces?

I am trying to get the values of the title and link with the attribute equals to alternate. But with the namespaces, I find it a bit challenging to get the values.
I have added my namespaces as follows but my result is comming back with Enumeration yeilds no result:
nameSpaceManager_ = new XmlNamespaceManager(new NameTable());
nameSpaceManager_.AddNamespace("viz", "http://www.vizrt.com/atom");
nameSpaceManager_.AddNamespace("atom", "http://www.w3.org/2005/Atom");
I am using XDocument with a mixture of linq and xpath to query my data.
I use the XPath as follows:
var showName = showNode.XPathEvaluate("/atom:entry/atom:title/text()", nameSpaceManager_);
UPDATE
XML:
<?xml version="1.0" encoding="UTF-8"?>
<feed xml:base="http://127.0.0.1:8580/directory/shows/" xmlns="http://www.w3.org/2005/Atom">
<entry xmlns="http://www.w3.org/2005/Atom"
xmlns:viz="http://www.vizrt.com/atom">
<title>My Show</title>
<author>
<name>Media Sequencer</name>
</author>
<id>tag:user,2017-02-03:0:/directory/shows/My%20Show.show</id>
<updated>2017-02-03T11:41:05Z</updated>
<summary>Show My Show</summary>
<category scheme="http://www.vizrt.com/types" term="directory" />
<category scheme="http://www.vizrt.com/types" term="show" />
<category scheme="http://www.vizrt.com/types" term="trio_4_layer_collection" label="Trio 4 Layer Collection" />
<link type="application/atom+xml;type=feed" rel="alternate" href="http://127.0.0.1:8580/show/%7B4575C71F-FC79-4813-A92F-D6297D5C517C%7D/" />
<link type="application/atom+xml;type=entry" rel="self" href="http://127.0.0.1:8580/directory/shows/My%20Show.show" />
<viz:empty>false</viz:empty>
</entry>
<entry xmlns="http://www.w3.org/2005/Atom"
xmlns:viz="http://www.vizrt.com/atom">
<title>My Show 2</title>
<author>
<name>Media Sequencer</name>
</author>
<id>tag:user,2017-02-03:0:/directory/shows/My%20Show.show</id>
<updated>2017-02-03T11:41:05Z</updated>
<summary>Show My Show</summary>
<category scheme="http://www.vizrt.com/types" term="directory" />
<category scheme="http://www.vizrt.com/types" term="show" />
<category scheme="http://www.vizrt.com/types" term="trio_4_layer_collection" label="Trio 4 Layer Collection" />
<link type="application/atom+xml;type=feed" rel="alternate" href="http://127.0.0.1:8580/show/%7B4575C71F-FC79-4813-A92F-D6297D5C517C%7D/" />
<link type="application/atom+xml;type=entry" rel="self" href="http://127.0.0.1:8580/directory/shows/My%20Show.show" />
<viz:empty>false</viz:empty>
</entry>
</feed>
Updated Query:
var exEl = xmlDoc.XPathSelectElements("//atom:feed/atom:entry[atom:category/#term='show']", nameSpaceManager_);
foreach (var showNode in exEl.Cast<XElement>())
{
var showName = showNode.XPathSelectElement("/atom:entry/atom:title", nameSpaceManager_).Value;
var linkTypes = showNode.XPathSelectElements("/atom:entry/atom:link[#rel='alternate']", nameSpaceManager_)
.Select(e => e.Attribute("type").Value);
}
You do almost everything right.
Just use XPathSelectElement instead of XPathEvaluate.
var showName = showNode.XPathSelectElement("/atom:entry/atom:title", nameSpaceManager_).Value;
var linkTypes = showNode.XPathSelectElements("/atom:entry/atom:link[#rel='alternate']", nameSpaceManager_)
.Select(e => e.Attribute("type").Value);

How to get the multiple values from xml?

My xml format is like
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<feed xml:base="http://google.com/en-US/syndicate/" xmlns:d="http://schemas.google.com/ado/2007/08/dataservices" xmlns:m="http://schemas.giooglt.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
<title type="text">Partners</title>
<id>http://googlre.com/en-US/syndicate/Partners</id>
<updated>2014-01-16T21:33:20Z</updated>
<link rel="self" title="Partners" href="Partners" />
<entry>
<id>http://pinpoint.microsoft.com/en-US/syndicate/Partners('4555')</id>
<title type="text">M55p; Co</title>
<summary type="text">
cccc is a Certified Partner, reseller, and implementer of
Key industries we work with include:
• Financial services
• Professional services
• Media / publishing
By focusing on mid-market to enterprise clients,
</summary>
<published>2009-07-21T14:23:50-07:00</published>
<updated>2013-11-22T15:00:46-08:00</updated>
<author>
<name>google chrome</name>
<uri>http://google.com/</uri>
<email>retee#gmail.com</email>
</author>
<link rel="edit" title="Partner" href="Partners('4255')" />
<link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Links" type="application/atom+xml;type=feed" title="Links" href="Partners('4559')/Links">
<m:inline>
<feed>
<title type="text">Links</title>
<id>http://google.com/('429')/Links</id>
<updated>2014-01-16T21:33:20Z</updated>
<link rel="self" title="Links" href="Partners('4ff')/Links" />
<entry>
<id>http://ryryr.com/en-US/syndicate/Links('ufufr')</id>
<title type="text">
</title>
<updated>2014-01-16T21:33:20Z</updated>
<author>
<name />
</author>
<link rel="edit" title="Link" href="Links('partnerpage')" />
<category term="google.Commerce.ferrr.Syndicate.V2010_05.Link" sch="" eme="http://schemas.frrr.com/ado/2007/08/dataservices/scheme" />
<content type="application/xml">
<m:properties>
<d:Type>pgooglrpartnerpage</d:Type>
<d:Description>google Partner Page</d:Description>
<d:Url>http://googlgt.com/en-US/PartnerDetails.aspx?PartnerId=42555&wt.mc_id=66ttet</d:Url>
</m:properties>
</content>
</entry>
<entry>
<id>http://googlet.com/en-US/syndicate/Links('tpartnerrfipage')</id>
<title type="text">
</title>
<updated>2014-01-19T04:01:49Z</updated>
<author>
<name />
</author>
<link rel="edit" title="Link" href="Links('pinpointpartnerrfipage')" />
<category term="google.Commerce.Marketplace.Syndicate.V2010_05.Link" scheme="http://schemas.google.com/ado/2007/08/dataservices/scheme" />
<content type="application/xml">
<m:properties>
<d:Type>tpartnerrfipage</d:Type>
<d:Description>RFI Page</d:Description>
<d:Url>http://pinpoint.microsoft.com/en-US/RFI.aspx?partnerId=4295719419&wt.mc_id=54545</d:Url>
</m:properties>
</content>
</entry>
</feed>
</m:inline>
</link>
</entry>
<entry>
<id>http://pinpoint.microsoft.com/en-US/syndicate/Partners('45')</id>
<title type="text">vfere</title>
<summary type="text">
cccc is a Certified Partner, reseller, and implementer of
Key industries we work with include:
• Financial services
• Professional services
• Media / publishing
By focusing on mid-market to enterprise clients,
</summary>
<published>2009-07-21T14:23:50-07:00</published>
<updated>2013-11-22T15:00:46-08:00</updated>
<author>
<name>google chrome</name>
<uri>http://google.com/</uri>
<email>retee#gmail.com</email>
</author>
<link rel="edit" title="Partner" href="Partners('4255')" />
<link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Links" type="application/atom+xml;type=feed" title="Links" href="Partners('4559')/Links" >
<m:inline>
<feed>
<title type="text">Links</title>
<id>http://google.com/('429')/Links</id>
<updated>2014-01-16T21:33:20Z</updated>
<link rel="self" title="Links" href="Partners('4ff')/Links" />
<entry>
<id>http://ryryr.com/en-US/syndicate/Links('ufufr')</id>
<title type="text">
</title>
<updated>2014-01-16T21:33:20Z</updated>
<author>
<name />
</author>
<link rel="edit" title="Link" href="Links('partnerpage')" />
<category term="google.Commerce.ferrr.Syndicate.V2010_05.Link" scheme="http://schemas.frrr.com/ado/2007/08/dataservices/scheme" />
<content type="application/xml">
<m:properties>
<d:Type>pgooglrpartnerpage</d:Type>
<d:Description>google Partner Page</d:Description>
<d:Url>http://googlgt.com/en-US/PartnerDetails.aspx?PartnerId=42555&wt.mc_id=66ttet</d:Url>
</m:properties>
</content>
</entry>
<entry>
<id>http://googlet.com/en-US/syndicate/Links('tpartnerrfipage')</id>
<title type="text">
</title>
<updated>2014-01-19T04:01:49Z</updated>
<author>
<name />
</author>
<link rel="edit" title="Link" href="Links('pinpointpartnerrfipage')" />
<category term="google.Commerce.Marketplace.Syndicate.V2010_05.Link" scheme="http://schemas.google.com/ado/2007/08/dataservices/scheme" />
<content type="application/xml">
<m:properties>
<d:Type>tpartnerrfipage</d:Type>
<d:Description>RFI Page</d:Description>
<d:Url>http://pinpoint.microsoft.com/en-US/RFI.aspx?partnerId=4295719419&wt.m</d:Url>
</m:properties>
</content>
</entry>
</feed>
</m:inline>
</link>
</entry>
</feed>
I have written the code with some help so as to parse the Xml and get the data as
var reader = new StreamReader(#"C:/Users/Administrator/Downloads/direct.xml")
var xmlDoc = XDocument.Load(reader);
XNamespace atom = "http://www.w3.org/2005/Atom";
XNamespace metadata = "http://schemas.giooglt.com/ado/2007/08/dataservices/metadata";
XNamespace dataservices = "http://schemas.google.com/ado/2007/08/dataservices";
var result = xmlDoc.Root.Elements(atom + "entry")
.Select(e => new {
Title = e.Element(atom + "title").Value,
Id = e.Element(atom + "id").Value,
Urls = e.Elements(atom + "link")
.Where(l => l.Element(metadata + "inline") != null)
.SelectMany(l => l.Element(metadata + "inline")
.Element(atom + "feed")
.Elements(atom + "entry")
.Select(e1 => e1.Element(atom + "content")
.Element(metadata + "properties")
.Element(dataservices + "Url").Value))
});
foreach (var item in result)
{
Debug.WriteLine("{0}, {1}, {2}", item.Title, item.Id,item.Urls);
Debug.WriteLine(item.Urls.GetType());
foreach(var i in item.Urls){
Debug.WriteLine("i :"+i);
}
}
My desired output is -
M55p; Co,http://pinpoint.microsoft.com/en-US/syndicate/Partners('4555'),http://googlgt.com/en-US/PartnerDetails.aspx? PartnerId=42555&wt.mc_id=66ttet
M55p; Co,http://pinpoint.microsoft.com/en-US/syndicate/Partners('4555'),http://pinpoint.microsoft.com/en-US/RFI.aspx?partnerId=4295719419&wt.mc_id=54545
vfere,http://pinpoint.microsoft.com/en-US/syndicate/Partners('45'),http://googlgt.com/en-US/PartnerDetails.aspx?PartnerId=42555&wt.mc_id=66ttet
vfere,http://pinpoint.microsoft.com/en-US/syndicate/Partners('45'),http: //pinpoint.microsoft.com/en-US/RFI.aspx?partnerId=4295719419&wt.m
But the output I am getting from the above piece of code is :
M55p; Co,http://pinpoint.microsoft.com/en-US/syndicate/Partners('4555'),System.Linq.Enumerable+<SelectManyIterator>d__14`2[System.Xml.Linq.XElement,System.String]
M55p; Co,http://pinpoint.microsoft.com/en-US/syndicate/Partners('4555'),System.Linq.Enumerable+<SelectManyIterator>d__14`2[System.Xml.Linq.XElement,System.String]
vfere,http://pinpoint.microsoft.com/en-US/syndicate/Partners('45'),System.Linq.Enumerable+<SelectManyIterator>d__14`2[System.Xml.Linq.XElement,System.String]
vfere,http://pinpoint.microsoft.com/en-US/syndicate/Partners('45'),System.Linq.Enumerable+<SelectManyIterator>d__14`2[System.Xml.Linq.XElement,System.String]
I am getting the output as specified above and I am not quite sure why am I getting the above output. I desire to get the result for each 'Url' as is specified in the desired output. been fighting for a while to get the desired result.
Any help is appreciated. Novice programmer, new to C# not sure how to get the output. Is this because of the wrong XML format?
Your code is trying to call ToString() on a Linq expression which is why you're seeing that System.Linq.Enumerable+ gobbledygook.
You need to enumerate the Urls:
foreach (var item in result)
{
var i = 0;
foreach (var url in item.Urls)
{
Debug.WriteLine("{0}, {1}, {2}", item.Title, item.Id, url);
Debug.WriteLine(url.GetType());
Debug.WriteLine("i : " + i++);
}
}
or a more succinct way to write this:
result.ToList().ForEach(item =>
{
var i = 0;
foreach (var url in item.Urls)
{
Debug.WriteLine("{0}, {1}, {2}", item.Title, item.Id, url);
Debug.WriteLine(url.GetType());
Debug.WriteLine("i : " + i++);
}
});

C#/XML Populate TreeView with XML file

im trying to populate a treeview from a xml file.
Image of the output: http://i.stack.imgur.com/3HSCu.png
So as you can see the parents are loaded well, but the childs (the elements) not. All the child nodes are loaded in all parent nodes. But the xml is not like that.
This is the XML code:
<?xml version="1.0" encoding="utf-8" ?>
<toolbox>
<parent id="p1" caption="All Elements" class="parent">
<element id="1" name="Button" />
<element id="2" name="Label" />
<element id="3" name="Inputfield" />
<element id="4" name="Textarea" />
<element id="5" name="Image" />
<element id="6" name="Background" />
<element id="7" name="TreeView" />
</parent>
<parent id="p2" caption="Some Elements 1" class="parent">
<element id="1" name="Button" />
<element id="2" name="Label" />
<element id="3" name="Inputfield" />
</parent>
<parent id="p3" caption="Some Elements 2" class="parent">
<element id="4" name="Textarea" />
<element id="5" name="Image" />
<element id="6" name="Background" />
<element id="7" name="TreeView" />
</parent>
</toolbox>
This is the C# code:
public void loadElements(string XML_Elements, TreeView Elements_Tree){
XmlDocument XMLDocument = new XmlDocument();
XMLDocument.Load(XML_Elements);
Elements_Tree.Nodes.Clear();
Elements_Tree.BeginUpdate();
XmlNodeList XMLParent = XMLDocument.SelectNodes("toolbox/parent");
foreach(XmlNode xmlparent in XMLParent){
//add parents
string Parent_Caption = xmlparent.Attributes["caption"].Value;
TreeNode parents = Elements_Tree.Nodes.Add(Parent_Caption);
//add childs
XmlNodeList XMLChilds = XMLDocument.SelectNodes("toolbox/parent/element");
foreach (XmlNode xmlchild in XMLChilds)
{
string Child_Name = xmlchild.Attributes["name"].Value;
parents.Nodes.Add(Child_Name);
}
}
}
You have to search for elements only within current parent element. Try that:
XmlNodeList XMLChilds = XMLDocument.SelectNodes("toolbox/parent[#caption='" + Parent_Caption + "']/element");
Or maybe even better:
XmlNodeList XMLChilds = xmlparent.SelectNodes("element");
XMLDocument.SelectNodes("toolbox/parent/element") selects all nodes that match in the document. You need to get the children of the current XmlNode, not start at the XMLDocument.

XmlDocument from google analytics to flat file c#

Using C# I have extracted data from Google Analytics Data API and have got it in an xmldocument. From that point I want to export it to flat file format (txt file). I am trying to use the xmlnode class to write out element attribute values within the 'entry' elements but cant do it. XML code below:
<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dxp="http://schemas.google.com/analytics/2009" xmlns:openSearch="http://a9.com/- /spec/opensearch/1.1/">
<id>https://www.googleapis.com/analytics/v2.4/data?ids=ga:xxxxxxxxx&dimensions=ga:date,ga:hostname&metrics=ga:visits,ga:newVisits,ga:visitBounceRate,ga:transactions,ga:transactionRevenue,ga:itemQuantity&start-date=2012-09-20&end-date=2012-09-26&start-index=1&max-results=1000</id>
<updated>2012-09-27T08:08:53.621Z</updated>
<title type="text">Google Analytics Data for Profile xxxxxxxxx</title>
<link rel="self" type="application/atom+xml" href="https://www.googleapis.com/analytics/v2.4/data?ids=ga:xxxxxxxxx&dimensions=ga:date,ga:hostname&metrics=ga:visits,ga:newVisits,ga:visitBounceRate,ga:transactions,ga:transactionRevenue,ga:itemQuantity&start-date=2012-09-20&end-date=2012-09-26&start-index=1&max-results=1000" />
<author>
<name>Google Analytics</name>
</author>
<generator>Google Analytics</generator>
<openSearch:totalResults>49</openSearch:totalResults>
<openSearch:startIndex>1</openSearch:startIndex>
<openSearch:itemsPerPage>1000</openSearch:itemsPerPage>
<dxp:aggregates>
<dxp:metric name="ga:visits" type="integer" value="942258" />
<dxp:metric name="ga:newVisits" type="integer" value="393698" />
<dxp:metric name="ga:visitBounceRate" type="percent" value="26.960025810340692" />
<dxp:metric name="ga:transactions" type="integer" value="328" />
<dxp:metric name="ga:transactionRevenue" type="currency" value="427646.331187" />
<dxp:metric name="ga:itemQuantity" type="integer" value="322" />
</dxp:aggregates>
<dxp:containsSampledData>true</dxp:containsSampledData>
<dxp:dataSource>
<dxp:property name="ga:profileId" value="xxxxxxxxx" />
<dxp:property name="ga:webPropertyId" value="UA-33036832-1" />
<dxp:property name="ga:accountName" value="TCO-UK-TC.com-[thomascook.com]" />
<dxp:tableId>ga:xxxxxxxxx</dxp:tableId>
<dxp:tableName>ThomasCook UK - Analytics Extract (VP /search)</dxp:tableName>
</dxp:dataSource>
<dxp:endDate>2012-09-26</dxp:endDate>
<dxp:startDate>2012-09-20</dxp:startDate>
<entry>
<id>https://www.googleapis.com/analytics/v2.4/data?ids=ga:xxxxxxxxx&ga:date=20120920&ga:hostname=87.248.112.8&start-date=2012-09-20&end-date=2012-09-26</id>
<updated>2012-09-27T08:08:53.621Z</updated>
<title type="text">ga:date=20120920 | ga:hostname=87.248.112.8</title>
<link rel="alternate" type="text/html" href="http://www.google.com/analytics" />
<dxp:dimension name="ga:date" value="20120920" />
<dxp:dimension name="ga:hostname" value="87.248.112.8" />
<dxp:metric name="ga:visits" type="integer" value="3" />
<dxp:metric name="ga:newVisits" type="integer" value="3" />
<dxp:metric name="ga:visitBounceRate" type="percent" value="100.0" />
<dxp:metric name="ga:transactions" type="integer" value="0" />
<dxp:metric name="ga:transactionRevenue" type="currency" value="0.0" />
<dxp:metric name="ga:itemQuantity" type="integer" value="0" />
</entry>
<entry>
<id>https://www.googleapis.com/analytics/v2.4/data?ids=ga:xxxxxxxxx&ga:date=20120920&ga:hostname=alpha.thomascook.com&start-date=2012-09-20&end-date=2012-09-26</id>
<updated>2012-09-27T08:08:53.621Z</updated>
<title type="text">ga:date=20120920 | ga:hostname=alpha.thomascook.com</title>
<link rel="alternate" type="text/html" href="http://www.google.com/analytics" />
<dxp:dimension name="ga:date" value="20120920" />
<dxp:dimension name="ga:hostname" value="alpha.thomascook.com" />
<dxp:metric name="ga:visits" type="integer" value="160" />
<dxp:metric name="ga:newVisits" type="integer" value="109" />
<dxp:metric name="ga:visitBounceRate" type="percent" value="21.25" />
<dxp:metric name="ga:transactions" type="integer" value="0" />
<dxp:metric name="ga:transactionRevenue" type="currency" value="0.0" />
<dxp:metric name="ga:itemQuantity" type="integer" value="0" />
</entry>
....so on.....
In the code below I need to change it to locate the entry elements, but can't find it. Using "/entry" yields nothing.
XmlNamespaceManager xmlnsm = new XmlNamespaceManager(xmld.NameTable);
xmlnsm.AddNamespace("dxp", "http://schemas.google.com/analytics/2009");
xmlnsm.AddNamespace("openSearch", "http://a9.com/-/spec/opensearch/1.1/");
xmlnsm.AddNamespace("gd", "http://schemas.google.com/g/2005");
foreach (XmlNode xmlnd in xmld.SelectNodes("//dxp:dimension", xmlnsm))
{
DimVal = xmlnd.Attributes["value"].Value.ToString();
DimName = xmlnd.Attributes["name"].Value.Replace("ga:", "");
// ...
}
I could be missing a namespace. Can anyone please help me out?
XDocument xDoc = XDocument.Load(fileToLoad); //or XDocument.Parse(xmlString)
XNamespace dxp = "http://schemas.google.com/analytics/2009";
XNamespace ns = "http://www.w3.org/2005/Atom";
var result =
xDoc.Descendants(ns + "entry")
.Select(e => new
{
Dimension = e.Descendants(dxp + "dimension")
.ToDictionary(d => d.Attribute("name").Value, d => d.Attribute("value").Value),
Metric = e.Descendants(dxp + "metric")
.ToDictionary(d => d.Attribute("name").Value, d => d.Attribute("value").Value)
})
.ToList();
Print the result:
foreach(var entry in result)
{
foreach (var dim in entry.Dimension)
Console.WriteLine(dim.Key + " = " + dim.Value);
Console.WriteLine();
foreach (var met in entry.Metric)
Console.WriteLine(met.Key + " = " + met.Value);
Console.WriteLine("---------------");
}
If you're just interested in getting all of the dxp:dimension elements you could use
GetElementsByTagName("dimension", "http://schemas.google.com/analytics/2009")
instead of
SelectNodes("//dxp:dimension", xmlnsm)
If you're intent on using SelectNodes, I think you need another / ("///dxp:dimension").
Specifically for your case you can do:
foreach(XmlElement ele in xmld.GetElementsByTagName("element"))
{
foreach(XmlElement dim in ele.GetElementsByTagName("dimension", "http://schemas.google.com/analytics/2009")
{
// Do w/e w/ the element
}
foreach(XmlElement met in ele.GetElementsByTagName("metric", "http://schemas.google.com/analytics/2009")
{
// Do w/e w/ the element
}
}

Parsing XML Element

i am trying to parse an xml element (DItem >> Title)
below is my code but somehow i am not getting hold of it.... any help?
XDocument xdoc1 = XDocument.Load(url);
XNamespace ns = "http://sitename/items.xsd";
string topic = xdoc1.Descendants(ns + "DItem")
.Select(x => (string)x.Attribute("Title"))
.FirstOrDefault();
<?xml version='1.0'?>
<root xmlns="http://www.w3.org/2005/Atom">
<title type="text">title</title>
<entry>
<id>da7d3189-fd89-4d3f-901c-30eab7a3baa5</id>
<title type="text">Swimming Pools</title>
<summary type="text"></summary>
<updated>2011-08-19T19:02:21Z</updated>
<link rel="alternate" href="link" />
<link href="link" />
<content type="application/xml">
<Items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.namespace.xsd">
<CatalogSource Acronym="ABC" OrganizationName="organization name" />
<Item Id="28466" CatalogUrl="url">
<DItem xmlns:content="http://namespace.xsd" TargetUrl="http://index.html" Title="my title">
<content:Source Acronym="ABC" OrganizationName="ABC" />
</DItem>
</Item>
</Items>
</content>
</entry>
</root>
Using the namespace "http://www.namespace.xsd" should (and does) work:
XNamespace ns = "http://www.namespace.xsd";
string topic = xdoc1.Descendants(ns + "DItem")
.Select(x => (string)x.Attribute("Title"))
.FirstOrDefault();
Since DItem is not qualified with a namespace itself, it will use the default namespace specified asxmlns="http://www.namespace.xsd" on its parent element.

Categories

Resources