Как получить значение узла, передав тип в XDocument C # - PullRequest
0 голосов
/ 05 апреля 2019

у меня ниже XML.

<subscription>
    <subscription_add_ons type="array">
        <subscription_add_on>
            <add_on_code>premium_support</add_on_code>
            <name>Premium Support</name>
            <quantity type="integer">1</quantity>
            <unit_amount_in_cents type="integer">15000</unit_amount_in_cents>
            <add_on_type>fixed</add_on_type>
            <usage_percentage nil="true"></usage_percentage>
            <measured_unit_id nil="true"></measured_unit_id>
        </subscription_add_on>
    </subscription_add_ons>

Моя функция XMLParse

public XNode GetXmlNodes(XElement xml, string elementName)
    {
       List<string> addOnCodes= new List<string>();
       //elementName = "subscription_add_ons ";
        var addOns = xml.DescendantNodes().Where(x => x.Parent.Name == elementName).FirstOrDefault();
        foreach (XNode addOn in addOns)
        {
             //Needed to do something like this
            /*var len =  "add_on_code".Length + 2;
            var sIndex = addOn.ToString().IndexOf("<add_on_code>") + len;
            var eIndex = addOn.ToString().IndexOf("</add_on_code>");
            var addOnCode = addOn.ToString().Substring(sIndex, (eIndex - sIndex)).Trim().ToLower();
            addOnCodes.Add(addOnCode);*/
        }

Как уже упоминалось в комментариях @JonSkeet, я обновил свой фрагмент, как показано ниже.

  var addOns = xml.Descendants(elementName).Single().Elements();  

  foreach (XNode addOn in addOns)
        {
            /*addon = {<subscription_add_on>
            <add_on_code>premium_support</add_on_code>
            <name>Premium Support</name>
            <quantity type="integer">1</quantity>
            <unit_amount_in_cents type="integer">15000</unit_amount_in_cents>
            <add_on_type>fixed</add_on_type>
            <usage_percentage nil="true"></usage_percentage>
            <measured_unit_id nil="true"></measured_unit_id>
        </subscription_add_on>} */
         //how to get the addOnCode node value ?
            var addOnCode = string.Empty;
            addOnCodes.Add(addOnCode);
        }

Но мне нужно из переданного XML получить все узлы типа subscription_add_on, затем получить значение, содержащееся в add_on_code, и добавить его в коллекцию строк.

Или вообще получить значение узла, передав тип? Пробовал использовать доступные методы VS Intellisense, но не получил точный метод, который может это сделать?

Спасибо!

1 Ответ

0 голосов
/ 05 апреля 2019

Вот решение с Xml Linq (XDOCUMENT):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication107
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            var results = doc.Descendants("subscription_add_on").Select(x => new
            {
                add_on_code = (string)x.Element("add_on_code"),
                name = (string)x.Element("name"),
                quantity = (int)x.Element("quantity"),
                amount = (int)x.Element("unit_amount_in_cents"),
                add_on_type = (string)x.Element("add_on_type")
            }).ToList();

        }
    }


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