получить значения атрибута от xml в c# - PullRequest
0 голосов
/ 04 марта 2020

Я использую C# и хочу разобрать элементы Relationship.
Я хочу получить значение "MarketplaceId" (A1F83G8C2ARO7P) и "ASIN" (B076B1GP37)

Вот мой XML.

   <Relationships>
     <VariationParent xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01">
      <Identifiers>
        <MarketplaceASIN>
          <MarketplaceId>A1F83G8C2ARO7P</MarketplaceId>
          <ASIN>B076B1GP37</ASIN>
        </MarketplaceASIN>
      </Identifiers>
    </VariationParent>
  </Relationships>

А вот мой код до сих пор.

if (relationshipList.IsSetAny())
{
   foreach(var relationship in relationshipList.Any)
   {
      string rxml = ProductsUtil.FormatXml((System.Xml.XmlElement)relationship);
      XDocument xDoc = XDocument.Parse(rxml);
      XNamespace ns = XNamespace.Get("http://mws.amazonservices.com/schema/Products/2011-10-01");

      IEnumerable<object> relationships = xDoc.Descendants();

      foreach (System.Xml.Linq.XElement xe in relationships)
      {
         string r_marketplaceId = (string)xe.Attribute("MarketplaceId");
         string r_ASIN = (string)xe.Attribute("ASIN");                                        
      }
    }
}

Выше xe ниже

 <VariationParent xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01">
  <Identifiers>
    <MarketplaceASIN>
      <MarketplaceId>A1F83G8C2ARO7P</MarketplaceId>
      <ASIN>B076B1GP37</ASIN>
    </MarketplaceASIN>
  </Identifiers>
</VariationParent>

r_marketplaceId и r_ASIN по-прежнему Null value. Любые советы и предложения будут высоко оценены.

Ответы [ 3 ]

0 голосов
/ 04 марта 2020

Первое замечание, вы объявляете xn и не используете его.

Вы можете получить значения по запросу LINQ, например, следующий код:

XNamespace xn = "http://mws.amazonservices.com/schema/Products/2011-10-01";

IEnumerable<string> elements = XDocument.Parse(rxml)
    .Descendants(xn + "MarketplaceASIN")
    .Descendants()
    .Where(e=>!e.HasElements)
    .Select(element => element.Value);

Console.WriteLine(string.Join(", ", elements));

Результат

A1F83G8C2ARO7P, B076B1GP37

Надеюсь, это поможет вам.

0 голосов
/ 04 марта 2020

Используйте xml linq со словарем. Смотрите код ниже

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

namespace ConsoleApplication159
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            XNamespace ns = doc.Root.GetDefaultNamespace();
            Dictionary<string, string> dict1 = doc.Descendants(ns + "MarketplaceASIN")
                .GroupBy(x => (string)x.Element(ns + "MarketplaceId"), y => (string)y.Element(ns + "ASIN"))
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());
            //where MarketplaceId may be repeated
            Dictionary<string, List<string>> dict2 = doc.Descendants(ns + "MarketplaceASIN")
                 .GroupBy(x => (string)x.Element(ns + "MarketplaceId"), y => (string)y.Element(ns + "ASIN"))
                .ToDictionary(x => x.Key, y => y.ToList());
        }
    }
}
0 голосов
/ 04 марта 2020

Я подозреваю, что проблема - вы не имеете дело с атрибутами здесь. Рассмотрим пример:

<VariationParent xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01">
  <Identifiers>
    <MarketplaceASIN MarketplaceId="A1F83G8C2ARO7P" ASIN="B076B1GP37" /> <!-- these are attributes -->
  </Identifiers>
</VariationParent>
<!------------>
 <VariationParent xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01">
  <Identifiers>
    <MarketplaceASIN>
      <MarketplaceId>A1F83G8C2ARO7P</MarketplaceId> <!-- these are values -->
      <ASIN>B076B1GP37</ASIN> <!-- these are values -->
    </MarketplaceASIN>
  </Identifiers>
</VariationParent>

первый фрагмент полагается на attributes, а ваш выражает данные как values. Поэтому вам, вероятно, нужно изменить код следующим образом:

string r_marketplaceId = (string)xe.XPathSelectElement("//MarketplaceId").Value;
string r_ASIN = (string)xe.XPathSelectElement("//ASIN").Value;

, надеюсь, это решит вашу проблему

...