Как получить конкретные данные из файла XML с использованием ASP.NET - PullRequest
0 голосов
/ 01 июня 2018

Мне удалось получить все мои данные из моего XML и отобразить их на моем сайте (работает правильно).Однако я не хочу отображать все данные, которые я получил.

Я хочу получить и отобразить только некоторые конкретные значения, такие как Клиент -> Идентификатор, Имя, Адрес и ShippingAddress -> Идентификатор, Имя и Адрес(У меня есть список на основе имеющегося у меня xml).

Структура XML

<?xml version="1.0" encoding="windows-1252"?>
<Response>
  <Result>
    <TotalCount>1</TotalCount>
    <Customer>
      <field name="Id" value="1234" />
      <field name="Name" value="Dr. Strange" />
      <field name="Address" value="122 New York" />
      <field name="Address2" value="" />
      <field name="Phone" value="3333333333" />
      <field name="ZipCode" value="V5C 6N5" />
      <ShippingAddresses>
        <ShippingAddress>
          <field name="Id" value="456" />
          <field name="Name" value="Wong" />
          <field name="Address" value="122 Drive" />
          <field name="Address2" value="" />
          <field name="ZipCode" value="V5C 6N5" />
       </ShippingAddress>
    </ShippingAddresses>
    </Customer>
  </Result>
  <Errors />
</Response>

CustomerController.cs

XmlNodeList customerNodes = xmlDocument.SelectNodes("// Customer");
List<CustomerViewModel> customerList = new List<CustomerViewModel>();
CustomerViewModel customer = new CustomerViewModel();

foreach (XmlNode node in customerNodes)
{ 
  XmlNodeList fieldNodes = node.SelectNodes("field");
  foreach (XmlNode fieldNode in fieldNodes)
  {
    string attrName = fieldNode.Attributes["name"].Value;
    string attrValue = fieldNode.Attributes["value"].Value;
    if (customer.GetType().GetProperty(attrName) != null)
    {
      customer.GetType().GetProperty(attrName).SetValue(customer, attrValue);
    }
  }
  customerList.Add(customer);
}

CustomerViewModel.cs

public string Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public string Address2 { get; set; }
public string Phone { get; set; }
public string ZipCode { get; set; }

В настоящее время мой customerList содержит все, и я могу отображать каждое значение.Мне просто нужно отобразить выбранную информацию.

Примечание. Я только что обрезал свой XML-файл, чтобы его было легче читать

1 Ответ

0 голосов
/ 01 июня 2018

попробуйте это

классы должны быть

public class Customer
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public string Address { get; set; }
        public List<ShippingAddress> ShippingAddresses { get; set; }
    }
    public class ShippingAddress
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public string Address { get; set; }
    }

и логика должна быть

XmlNodeList nodeList = doc.SelectNodes("// Customer");
            List<Customer> customers = new List<Customer>();
            foreach (XmlNode node in nodeList)
            {
                Customer customer = new Customer();
                XmlNodeList fieldNodes = node.SelectNodes("field");
                foreach (XmlNode fieldNode in fieldNodes)
                {
                    string attrName = fieldNode.Attributes["name"].Value;
                    string attrValue = fieldNode.Attributes["value"].Value;
                    if (customer.GetType().GetProperty(attrName)!=null)
                    {
                        customer.GetType().GetProperty(attrName).SetValue(customer, attrValue);
                    }
                }
                XmlNodeList shippingNodes = node.SelectNodes("ShippingAddresses/ShippingAddress");
                List<ShippingAddress> ShippingAddresses = new List<ShippingAddress>();
                foreach (XmlNode shippingNode in shippingNodes)
                {
                    ShippingAddress ShippingAddress = new ShippingAddress();
                    XmlNodeList shippingFieldNodes = shippingNode.SelectNodes("field");
                    foreach (XmlNode shippingFieldNode in shippingFieldNodes)
                    {
                        string attrName = shippingFieldNode.Attributes["name"].Value;
                        string attrValue = shippingFieldNode.Attributes["value"].Value;
                        if (ShippingAddress.GetType().GetProperty(attrName) != null)
                        {
                            ShippingAddress.GetType().GetProperty(attrName).SetValue(ShippingAddress, attrValue);
                        }
                    }
                    ShippingAddresses.Add(ShippingAddress);
                }
                customer.ShippingAddresses = ShippingAddresses;
                customers.Add(customer);
            }

Обновлено

Вы должны поставить CustomerViewModel customer = new CustomerViewModel(); вforeach цикл из CustomerController.cs, как указано ниже

CustomerController.cs

XmlNodeList customerNodes = xmlDocument.SelectNodes("// Customer");
List<CustomerViewModel> customerList = new List<CustomerViewModel>();

foreach (XmlNode node in customerNodes)
{ 
  CustomerViewModel customer = new CustomerViewModel();
  XmlNodeList fieldNodes = node.SelectNodes("field");
  foreach (XmlNode fieldNode in fieldNodes)
  {
    string attrName = fieldNode.Attributes["name"].Value;
    string attrValue = fieldNode.Attributes["value"].Value;
    if (customer.GetType().GetProperty(attrName) != null)
    {
      customer.GetType().GetProperty(attrName).SetValue(customer, attrValue);
    }
  }
  customerList.Add(customer);
}

Обновление для вашего cshtml-запроса

1) Модель ShippingAddress

public class ShippingAddress
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public string Address { get; set; }
    }

2) CustomerViewModel.cs

public class CustomerViewModel{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
    public string Address2 { get; set; }
    public string Phone { get; set; }
    public string ZipCode { get; set; }
    public List<ShippingAddress> ShippingAddresses { get; set; }
}

3) cshtml

@model CustomerViewModel
.
.
.
.
@foreach(var shippingAddress in Model.ShippingAddresses)
{
    <label>@shippingAddress.Name</label>
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...