Reputation: 8652
I have an xmfile file shown below where I have to get all nodes values CIName,Type,Status,FriendlyName,AccountNo
. I was trying to get result by using XDocument
with no success.
<?xml version="1.0" encoding="utf-8"?>
<RetrievedeviceListResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" schemaRevisionLevel="0" returnCode="0" status="SUCCESS" message="Success" schemaRevisionDate="2015-03-24">
<instance uniquequery="file.device,logical.name="mss-abb-aejaljabelalifz-ra"" query="" xmlns="http://schemas.hp.com/SM/7">
<file.device type="Structure">
<CIName type="String">mss-abb-aejaljabelalifz-ra</CIName>
<Type type="String">networkcomponents</Type>
<Status type="String">In use</Status>
<FriendlyName type="String">Jabel Ali Free Zone</FriendlyName>
<Company type="String">ABB - MWAN</Company>
</file.device>
<file.networkcomponents type="Structure">
<AccountNo type="String">1444016683</AccountNo>
</file.networkcomponents>
<attachments xsi:nil="true" />
</instance>
<instance uniquequery="file.device,logical.name="mss-abb-aldar-ra"" query="" xmlns="http://schemas.hp.com/SM/7">
<file.device type="Structure">
<CIName type="String">mss-abb-aldar-ra</CIName>
<Type type="String">networkcomponents</Type>
<Status type="String">In use</Status>
<FriendlyName type="String">Al Dar AUH Main</FriendlyName>
<Company type="String">ABB - MWAN</Company>
</file.device>
<file.networkcomponents type="Structure">
<AccountNo type="String">1222229614</AccountNo>
</file.networkcomponents>
<attachments xsi:nil="true" />
</instance>
<instance uniquequery="file.device,logical.name="mss-abb-aldar-rb"" query="" xmlns="http://schemas.hp.com/SM/7">
<file.device type="Structure">
<CIName type="String">mss-abb-aldar-rb</CIName>
<Type type="String">networkcomponents</Type>
<Status type="String">In use</Status>
<FriendlyName type="String">Al Dar-AUH-Backup</FriendlyName>
<Company type="String">ABB - MWAN</Company>
</file.device>
<file.networkcomponents type="Structure">
<AccountNo type="String">1222222368</AccountNo>
</file.networkcomponents>
<attachments xsi:nil="true" />
</instance>
</RetrievedeviceListResponse>
I used the following code
XDocument xdoc = XDocument.Load(path);
var authors = xdoc.Descendants("RetrievedeviceListResponse");
foreach (var author in authors)
{
Console.WriteLine("{0}{1}",author.Name, author.Value);
}
Upvotes: 0
Views: 1788
Reputation: 5708
So maybe you could use something like this:
const string @namespaceName = "http://schemas.hp.com/SM/7";
XDocument xdoc = XDocument.Load(path);
var authors = xdoc.Descendants(XName.Get("instance", @namespaceName));
foreach (var author in authors)
{
string ciName = author.Descendants(XName.Get("CIName", namespaceName)).First().Value;
string type = author.Descendants(XName.Get("Type", namespaceName)).First().Value;
string frendlyName = author.Descendants(XName.Get("Type", namespaceName)).First().Value;
string accountNo = author.Descendants(XName.Get("AccountNo", namespaceName)).First().Value;
Console.WriteLine("{0}, {1}, {2}, {3}", ciName, type, frendlyName, accountNo);
}
You must use this namespaces if you want to use this code:
using System.Linq;
using System.Xml.Linq;
Upvotes: 2
Reputation: 2382
How about something like:
var doc = XDocument.Load(@"C:\TestCases\test.xml");
foreach (var node in doc.Descendants().Where(x => "CIName Type Status FriendlyName AccountNo".Contains(x.Name.LocalName)))
{
Console.WriteLine(string.Format("{0}:{1}", node.Name.LocalName, node.Value));
}
or pure linq:
XDocument.Load(@"C:\TestCases\test.xml").Descendants().Where(x => "CIName Type Status FriendlyName AccountNo".Contains(x.Name.LocalName)).ToList().ForEach(x => Console.WriteLine(string.Format("{0}:{1}", x.Name.LocalName, x.Value)));
Your not closing your "RetrievedeviceListResponse" in your xml too.
Upvotes: 1
Reputation: 621
XmlDocument doc = new XmlDocument();
doc.Load(path); // Where path is the location of the XML file
XmlNodeList nodes = doc.DocumentElement.SelectNodes("RetrieveDeviceListResponse");
for (int i = 0; i < nodes.Count; i++)
{
Console.WriteLine("Parent Node - {0}", nodes[i].InnerText);
for(int j = 0; j < nodes[i].ChildNodes.Count; j++)
{
Console.WriteLine("Child Node - {0}", nodes[i].ChildNodes[j].InnerText);
}
}
Does this do what you are looking for?
Upvotes: 0