Reputation: 231
I am trying to read the following XML with C#
<GetAssetWarrantyResponse xmlns="http://tempuri.org/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<GetAssetWarrantyResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:a="http://schemas.datacontract.org/2004/07/Dell.AWR.Domain.Asset">
<a:Faults />
<a:Response>
<a:DellAsset>
<a:AssetParts i:nil="true" />
<a:CountryLookupCode>XXXX</a:CountryLookupCode>
<a:CustomerNumber>XXXXXX</a:CustomerNumber>
<a:IsDuplicate>false</a:IsDuplicate>
<a:ItemClassCode>XXX</a:ItemClassCode>
<a:LocalChannel>XXXX</a:LocalChannel>
<a:MachineDescription>XXXXXXX</a:MachineDescription>
<a:OrderNumber>XXXXXX</a:OrderNumber>
<a:ParentServiceTag i:nil="true" />
<a:ServiceTag>XXXXXX</a:ServiceTag>
<a:ShipDate>2010-04-12T19:00:00</a:ShipDate>
<a:Warranties>
<a:Warranty>
<a:EndDate>2011-04-13T18:59:59</a:EndDate>
<a:EntitlementType>INITIAL</a:EntitlementType>
<a:ItemNumber>709-10398</a:ItemNumber>
<a:ServiceLevelCode>CB</a:ServiceLevelCode>
<a:ServiceLevelDescription>Collect and Return Initial with Dates</a:ServiceLevelDescription>
<a:ServiceLevelGroup>5</a:ServiceLevelGroup>
<a:ServiceProvider i:nil="true" />
<a:StartDate>2010-04-12T19:00:00</a:StartDate>
</a:Warranty>
</a:Warranties>
</a:DellAsset>
</a:Response>
</GetAssetWarrantyResult>
</GetAssetWarrantyResponse>
I think I have an issue with the namespace and whatever I've tried so far didn't work.
I've tried so far
XNamespace aw = "a"
XNamespace aw = "a:"
XNamespace aw = "http://schemas.xmlsoap.org/soap/envelope/"
and some other than I can't recall at the moment
private void btDellWaranty_Click(object sender, EventArgs e)
{
string serviceTag = tbDellServiceTag.Text;
string uri= https://api.dell.com/support/v2/assetinfo/warranty/tags?svctags=XXXX&apikey=XXXX";
XDocument Doc = XDocument.Load(uri);
XNamespace aw = "a";
string result = doc.from u in Doc.Descendants(aw + "DellAsset") select (string)u.Element(aw + "MachineDescription").Value;
XElement result = Doc.Root.Element("GetAssetWarrantyResponse");
}
Any ideas?
Notes: I pass the tbDellServiceTag.Text
correctly to the uri
so that's not the issue.
Upvotes: 0
Views: 53
Reputation: 26223
The namespace for a prefix (e.g. a:DellAsset
has the prefix a
) is denoted by the xmlns:a="..."
of the element or the first ancestor element that contains that namespace declaration - GetAssetWarrantyResult
in this case.
So, your namespace is:
XNamespace aw = "http://schemas.datacontract.org/2004/07/Dell.AWR.Domain.Asset"
Upvotes: 1
Reputation: 34431
Try xml linq like this
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication6
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
XElement dellAsset = doc.Descendants().Where(x => x.Name.LocalName == "DellAsset").FirstOrDefault();
XNamespace ns = dellAsset.Name.Namespace;
string customerNumber = (string)dellAsset.Element(ns + "CustomerNumber");
}
}
}
Upvotes: 1