Reputation: 13
I have a 4000 lines of xmlresponse from a service. I extracted the particular section from that big xml using required tag name
XmlNodeList xmlForms = xmlDoc.GetElementsByTagName("Form");
From this node sample partial xml looks like below
<Form>
<FormID>3434294</FormID>
<StatusDate>0001-01-01T00:00:00</StatusDate>
<InternalFormNo>CADFADSFSAGDSADG01</InternalFormNo>
<ExternalFormNo>CADFASDFASFSC1001</ExternalFormNo>
<ProposalDescription>Treatment</ProposalDescription>
<ProposalForm>false</ProposalForm>
<StateApprovals>
<StateApproval>
<StateApprovalID>2245363363636</StateApprovalID>
<IssueLimitSet>
<IssueLimitSetID>88</IssueLimitSetID>
<Name>AccAdv</Name>
<Note />
<ModifyDate>0001-01-01T00:00:00</ModifyDate>
<IssueLimits>
<IssueLimit>
<IssueLimtID>80</IssueLimtID>
<GIAmount>62</GIAmount>
<SIAmount>0.00</SIAmount>
<ChangeProcessingCGIAmount>0</ChangeProcessingCGIAmount>
<MaximumMultiSelect>0</MaximumMultiSelect>
<CreateDate>0001-01-01T00:00:00</CreateDate>
<ModifyDate>0001-01-01T00:00:00</ModifyDate>
</IssueLimit>
</IssueLimits>
</IssueLimitSet>
<SpecialProcessing>false</SpecialProcessing>
<ModifyUser>TESTUSER</ModifyUser>
<ModifyDate>2016-02-17T17:52:59.163</ModifyDate>
</StateApproval>
</StateApprovals>
</Form>
I need to read the node GIAmount and extract it's value (62). But xpath notation always giving null value to me. How to read this child node from this sub-xml. simple xpath also giving null always .
foreach (XmlNode form in xmlForms)
{
var statusDate= form.SelectSingleNode("/Form/StatusDate"); //This always null i am getting
}
----------------Original xml------------Under Variations->Forms->Form --Some scenarios multiple form tags comes i need to read that particular node in every form-------
<?xml version="1.0" encoding="utf-8"?>
<Product xmlns="http://testtest.com/twmku">
<ProductID>72</ProductID>
<InternalDescription>AccidentAdvance</InternalDescription>
<ExternalDescription>AccidentAdvance</ExternalDescription>
<Variations>
<Variation>
<VariationID>231</VariationID>
<InternalDescription>AccidentAdvance123</InternalDescription>
<ExternalDescription>AccidentAdvance</ExternalDescription>
<ProposalDescription />
<IsProposalReady>false</IsProposalReady>
<StatusDate>2009-03-26T00:00:00</StatusDate>
<EffectiveDate>2009-04-01T00:00:00</EffectiveDate>
<WithdrawnDate>0001-01-01T00:00:00</WithdrawnDate>
<ModifyUser>Utesruser</ModifyUser>
<ModifyDate>2011-11-30T10:35:26.313</ModifyDate>
<Employers />
<Forms>
<Form>
<FormID>3493</FormID>
<IsGeneric>true</IsGeneric>
<HasLimitsInUnits>true</HasLimitsInUnits>
<Description>AccAdv Master Policy</Description>
<CreateUser>US\testMW</CreateUser>
<CreateDate>0001-01-01T00:00:00</CreateDate>
<ModifyUser>US\testMW</ModifyUser>
<ModifyDate>2011-12-12T11:42:40.06</ModifyDate>
<DataElements />
<StateApprovals>
<StateApproval>
<StateApprovalID>2256556</StateApprovalID>
<IssueLimitSet>
<IssueLimitSetID>88</IssueLimitSetID>
<Name>AccAdv Modtest</Name>
<Note />
<ModifyDate>0001-01-01T00:00:00</ModifyDate>
<IssueLimits>
<IssueLimit>
<IssueLimtID>80</IssueLimtID>
<Keyword>AccAdv Mod 1</Keyword>
<MinMarketingLimit>0.50</MinMarketingLimit>
<MaxMarketingLimit>12.00</MaxMarketingLimit>
<CGIAmount>0.00</CGIAmount>
<GIAmount>6</GIAmount>
<SIAmount>0.00</SIAmount>
<ChangeProcessingCGIAmount>0</ChangeProcessingCGIAmount>
<CreateDate>0001-01-01T00:00:00</CreateDate>
<ModifyDate>0001-01-01T00:00:00</ModifyDate>
</IssueLimit>
</IssueLimits>
</IssueLimitSet>
<StateRequirementSet />
<QuestionSet />
<SICSet />
<DateFiled>0001-01-01T00:00:00</DateFiled>
<SpecialProcessing>false</SpecialProcessing>
<ModifyUser>JBtestD</ModifyUser>
<ModifyDate>2016-02-18T14:39:50.927</ModifyDate>
</StateApproval>
</StateApprovals>
<Parameters />
<IsSelected>true</IsSelected>
</Form>
<Form>
<FormID>3495</FormID>
<IsGeneric>true</IsGeneric>
<HasLimitsInUnits>true</HasLimitsInUnits>
<Description>AccAdv Master main</Description>
<CreateUser>US\testMqW</CreateUser>
<CreateDate>0001-01-01T00:00:00</CreateDate>
<ModifyUser>US\testMW</ModifyUser>
<ModifyDate>2011-12-12T11:42:40.06</ModifyDate>
<DataElements />
<StateApprovals>
<StateApproval>
<StateApprovalID>26556</StateApprovalID>
<IssueLimitSet>
<IssueLimitSetID>88</IssueLimitSetID>
<Name>AccAdv Moretest</Name>
<Note />
<ModifyDate>0001-01-01T00:00:00</ModifyDate>
<IssueLimits>
<IssueLimit>
<IssueLimtID>84</IssueLimtID>
<Keyword>AccAdv Mod 1</Keyword>
<MinMarketingLimit>0.50</MinMarketingLimit>
<MaxMarketingLimit>12.00</MaxMarketingLimit>
<CGIAmount>0.00</CGIAmount>
<GIAmount>34</GIAmount>
<SIAmount>0.00</SIAmount>
<ChangeProcessingCGIAmount>0</ChangeProcessingCGIAmount>
<CreateDate>0001-01-01T00:00:00</CreateDate>
<ModifyDate>0001-01-01T00:00:00</ModifyDate>
</IssueLimit>
</IssueLimits>
</IssueLimitSet>
<StateRequirementSet />
<QuestionSet />
<SICSet />
<DateFiled>0001-01-01T00:00:00</DateFiled>
<SpecialProcessing>false</SpecialProcessing>
<ModifyUser>JBtestD</ModifyUser>
<ModifyDate>2016-02-18T14:39:50.927</ModifyDate>
</StateApproval>
</StateApprovals>
<Parameters />
<IsSelected>true</IsSelected>
</Form>
</Forms>
<ParameterValueSets />
<AllowCustomRates>false</AllowCustomRates>
</Variation>
</Variations>
</Product>
Upvotes: 0
Views: 151
Reputation: 34419
One value is usually not enough information. Try xml linq like below :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
string xml = File.ReadAllText(FILENAME);
XDocument doc = XDocument.Parse(xml);
XNamespace ns = doc.Root.GetDefaultNamespace();
List<StateApproval> approvals = doc.Descendants(ns + "StateApproval").Select(x => new StateApproval()
{
id = (string)x.Element(ns + "StateApprovalID"),
limitSetId = (string)x.Descendants(ns + "IssueLimitSetID").FirstOrDefault(),
name = (string)x.Descendants(ns + "Name").FirstOrDefault(),
modifyDate = (DateTime)x.Descendants(ns + "ModifyDate").FirstOrDefault(),
issueLimitId = (string)x.Descendants(ns + "IssueLimtID").FirstOrDefault(),
giAmount = (decimal)x.Descendants(ns + "GIAmount").FirstOrDefault(),
siAmount = (decimal)x.Descendants(ns + "SIAmount").FirstOrDefault(),
changeAmount = (decimal)x.Descendants(ns + "ChangeProcessingCGIAmount").FirstOrDefault(),
min = (decimal)x.Descendants(ns + "MinMarketingLimit").FirstOrDefault(),
max = (decimal)x.Descendants(ns + "MaxMarketingLimit").FirstOrDefault(),
createDate = (DateTime)x.Descendants(ns + "CreateDate").FirstOrDefault(),
}).ToList();
}
}
public class StateApproval
{
public string id { get; set; }
public string limitSetId { get; set; }
public string name { get; set; }
public DateTime modifyDate { get; set; }
public string issueLimitId { get; set; }
public decimal giAmount { get; set; }
public decimal siAmount { get; set; }
public decimal changeAmount { get; set; }
public decimal min { get; set; }
public decimal max { get; set; }
public DateTime createDate { get; set; }
}
}
Upvotes: 0
Reputation: 22187
It is better to use LINQ to XML. Using its methods, it is very easy to get to any XML element.
(1) Your XML has a default namespace. It needs to be taken into account. (2) Multiple <Form>...</Form>
elements require a loop.
c#
void Main()
{
XElement xelem = XElement.Parse(@"<Product xmlns='http://testtest.com/twmku'>
<ProductID>72</ProductID>
<InternalDescription>AccidentAdvance</InternalDescription>
<ExternalDescription>AccidentAdvance</ExternalDescription>
<Variations>
<Variation>
<VariationID>231</VariationID>
<InternalDescription>AccidentAdvance123</InternalDescription>
<ExternalDescription>AccidentAdvance</ExternalDescription>
<ProposalDescription />
<IsProposalReady>false</IsProposalReady>
<StatusDate>2009-03-26T00:00:00</StatusDate>
<EffectiveDate>2009-04-01T00:00:00</EffectiveDate>
<WithdrawnDate>0001-01-01T00:00:00</WithdrawnDate>
<ModifyUser>Utesruser</ModifyUser>
<ModifyDate>2011-11-30T10:35:26.313</ModifyDate>
<Employers />
<Forms>
<Form>
<FormID>3493</FormID>
<IsGeneric>true</IsGeneric>
<HasLimitsInUnits>true</HasLimitsInUnits>
<Description>AccAdv Master Policy</Description>
<CreateUser>US\testMW</CreateUser>
<CreateDate>0001-01-01T00:00:00</CreateDate>
<ModifyUser>US\testMW</ModifyUser>
<ModifyDate>2011-12-12T11:42:40.06</ModifyDate>
<DataElements />
<StateApprovals>
<StateApproval>
<StateApprovalID>2256556</StateApprovalID>
<IssueLimitSet>
<IssueLimitSetID>88</IssueLimitSetID>
<Name>AccAdv Modtest</Name>
<Note />
<ModifyDate>0001-01-01T00:00:00</ModifyDate>
<IssueLimits>
<IssueLimit>
<IssueLimtID>80</IssueLimtID>
<Keyword>AccAdv Mod 1</Keyword>
<MinMarketingLimit>0.50</MinMarketingLimit>
<MaxMarketingLimit>12.00</MaxMarketingLimit>
<CGIAmount>0.00</CGIAmount>
<GIAmount>6</GIAmount>
<SIAmount>0.00</SIAmount>
<ChangeProcessingCGIAmount>0</ChangeProcessingCGIAmount>
<CreateDate>0001-01-01T00:00:00</CreateDate>
<ModifyDate>0001-01-01T00:00:00</ModifyDate>
</IssueLimit>
</IssueLimits>
</IssueLimitSet>
<StateRequirementSet />
<QuestionSet />
<SICSet />
<DateFiled>0001-01-01T00:00:00</DateFiled>
<SpecialProcessing>false</SpecialProcessing>
<ModifyUser>JBtestD</ModifyUser>
<ModifyDate>2016-02-18T14:39:50.927</ModifyDate>
</StateApproval>
</StateApprovals>
<Parameters />
<IsSelected>true</IsSelected>
</Form>
<Form>
<FormID>3495</FormID>
<IsGeneric>true</IsGeneric>
<HasLimitsInUnits>true</HasLimitsInUnits>
<Description>AccAdv Master main</Description>
<CreateUser>US\testMqW</CreateUser>
<CreateDate>0001-01-01T00:00:00</CreateDate>
<ModifyUser>US\testMW</ModifyUser>
<ModifyDate>2011-12-12T11:42:40.06</ModifyDate>
<DataElements />
<StateApprovals>
<StateApproval>
<StateApprovalID>26556</StateApprovalID>
<IssueLimitSet>
<IssueLimitSetID>88</IssueLimitSetID>
<Name>AccAdv Moretest</Name>
<Note />
<ModifyDate>0001-01-01T00:00:00</ModifyDate>
<IssueLimits>
<IssueLimit>
<IssueLimtID>84</IssueLimtID>
<Keyword>AccAdv Mod 1</Keyword>
<MinMarketingLimit>0.50</MinMarketingLimit>
<MaxMarketingLimit>12.00</MaxMarketingLimit>
<CGIAmount>0.00</CGIAmount>
<GIAmount>34</GIAmount>
<SIAmount>0.00</SIAmount>
<ChangeProcessingCGIAmount>0</ChangeProcessingCGIAmount>
<CreateDate>0001-01-01T00:00:00</CreateDate>
<ModifyDate>0001-01-01T00:00:00</ModifyDate>
</IssueLimit>
</IssueLimits>
</IssueLimitSet>
<StateRequirementSet />
<QuestionSet />
<SICSet />
<DateFiled>0001-01-01T00:00:00</DateFiled>
<SpecialProcessing>false</SpecialProcessing>
<ModifyUser>JBtestD</ModifyUser>
<ModifyDate>2016-02-18T14:39:50.927</ModifyDate>
</StateApproval>
</StateApprovals>
<Parameters />
<IsSelected>true</IsSelected>
</Form>
</Forms>
<ParameterValueSets />
<AllowCustomRates>false</AllowCustomRates>
</Variation>
</Variations>
</Product>");
//string GIAmount = GIAmount.Descendants(ns + "GIAmount").FirstOrDefault().Value;
XNamespace ns = xelem.GetDefaultNamespace();
foreach (var el in xelem.Descendants(ns + "GIAmount"))
{
Console.WriteLine("GIAmount={0}", el.Value);
}
}
Output
GIAmount=6
GIAmount=34
Upvotes: 0
Reputation: 7304
You are already targeting the Form
element, thus there's no reason to include it in the XPath. Simply skip that tag, and compose the path with its descendants.
In your case: "StateApprovals/StateApproval/IssueLimitSet/IssueLimits/GIAmount"
Or, more compact: "//GIAmount"
Note that my answer is based on the fragment of your post, and the path may change on the actual content.
Upvotes: 1