Чтение значения дочернего узла из большого xml в C# - PullRequest
0 голосов
/ 25 мая 2020

У меня 4000 строк xml-ответа от службы. Я извлек конкретный раздел из этого большого xml, используя требуемое имя тега

XmlNodeList xmlForms = xmlDo c .GetElementsByTagName ("Form");

Частичный пример этого узла xml выглядит как показано ниже

 <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>

Мне нужно прочитать узел GIAmount и извлечь его значение (62). Но нотация xpath всегда дает мне нулевое значение. Как прочитать этот дочерний узел из этого под- xml. простой xpath также всегда дает значение null.

foreach (XmlNode form in xmlForms)
                        {
                            var statusDate= form.SelectSingleNode("/Form/StatusDate"); //This always null i am getting

}

---------------- Оригинал xml ------------ В разделе Варианты -> Формы-> Форма - Некоторые сценарии ios приходят несколько тегов формы, мне нужно прочитать этот конкретный узел в каждой форме -------

<?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>

Ответы [ 3 ]

1 голос
/ 25 мая 2020

Вы уже нацеливаетесь на элемент Form, поэтому нет причин включать его в XPath. Просто пропустите этот тег и составьте путь с его потомками.

В вашем случае: "StateApprovals/StateApproval/IssueLimitSet/IssueLimits/GIAmount"

Или, что более компактно: "//GIAmount"

Обратите внимание, что мой ответ основан на фрагменте вашего сообщения, и путь может измениться в зависимости от фактического содержания.

0 голосов
/ 25 мая 2020

Одного значения обычно недостаточно. Попробуйте xml linq, как показано ниже:

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; }

    }
}
0 голосов
/ 25 мая 2020

Лучше использовать LINQ to XML. Используя его методы, очень легко добраться до любого элемента XML.

(1) Ваш XML имеет пространство имен по умолчанию. Это нужно учитывать. (2) Для нескольких элементов <Form>...</Form> требуется al oop.

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);    
    }
}

Выход

GIAmount=6
GIAmount=34
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...