2017-02-16 2 views
0

Wie bekomme ich jede Eigenschaft als XElement?Ausgabe jeder Eigenschaft als XElement

Ich versuche im Grunde, ein IEnumerable-Objekt in XML in einem Webdienst zu konvertieren.

Hier ist mein Code Ich versuche, in XML zu konvertieren.

 using (var db = new nopMass()) 
     { 
      var cats = db.Categories 
         .Where(x => x.Deleted == false 
            && x.Published == true) 
         .OrderBy(x => x.DisplayOrder) 
         .AsEnumerable() 
         .Select(cat => new Category 
         { 
          Id = cat.Id, 
          Name = cat.Name, 
          Description = cat.Description, 
          MetaKeywords = cat.MetaKeywords, 
          MetaDescription = cat.MetaDescription, 
          MetaTitle = cat.MetaTitle, 

          PictureId = cat.PictureId, 

          DisplayOrder = cat.DisplayOrder, 
          CreatedOnUtc = cat.CreatedOnUtc, 
          Product_Category_Mapping = cat.Product_Category_Mapping, 
          ParentCategoryId = cat.ParentCategoryId, 
         }) 
         .ToArray(); 


      XElement Configuration = new XElement("Collection", 
        cats 
        .ToList() 
        .Select(c => new XElement("Element", c))); 

      return Configuration.ToString(); 
     } 

bearbeiten

Kategorie Class Definition (mit EntityFramework 6-Code Erste)

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.ComponentModel.DataAnnotations.Schema; 
using System.Data.Entity.Spatial; 
[Table("Category")] 
public partial class Category 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public Category() 
    { 
     Product_Category_Mapping = new HashSet<Product_Category_Mapping>(); 
     Discounts = new HashSet<Discount>(); 
    } 

    public int Id { get; set; } 

    [Required] 
    [StringLength(400)] 
    public string Name { get; set; } 

    public string Description { get; set; } 

    public int CategoryTemplateId { get; set; } 

    [StringLength(400)] 
    public string MetaKeywords { get; set; } 

    public string MetaDescription { get; set; } 

    [StringLength(400)] 
    public string MetaTitle { get; set; } 

    public int ParentCategoryId { get; set; } 

    public int PictureId { get; set; } 

    public int PageSize { get; set; } 

    public bool AllowCustomersToSelectPageSize { get; set; } 

    [StringLength(200)] 
    public string PageSizeOptions { get; set; } 

    [StringLength(400)] 
    public string PriceRanges { get; set; } 

    public bool ShowOnHomePage { get; set; } 

    public bool IncludeInTopMenu { get; set; } 

    public bool HasDiscountsApplied { get; set; } 

    public bool SubjectToAcl { get; set; } 

    public bool LimitedToStores { get; set; } 

    public bool Published { get; set; } 

    public bool Deleted { get; set; } 

    public int DisplayOrder { get; set; } 

    public DateTime CreatedOnUtc { get; set; } 

    public DateTime UpdatedOnUtc { get; set; } 

Edit 2

Discount Klasse Difinition

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.ComponentModel.DataAnnotations.Schema; 
using System.Data.Entity.Spatial; 

[Table("Discount")] 
public partial class Discount 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public Discount() 
    { 
     DiscountRequirements = new HashSet<DiscountRequirement>(); 
     DiscountUsageHistories = new HashSet<DiscountUsageHistory>(); 
     Categories = new HashSet<Category>(); 
     Products = new HashSet<Product>(); 
    } 

    public int Id { get; set; } 

    [Required] 
    [StringLength(200)] 
    public string Name { get; set; } 

    public int DiscountTypeId { get; set; } 

    public bool UsePercentage { get; set; } 

    public decimal DiscountPercentage { get; set; } 

    public decimal DiscountAmount { get; set; } 

    public DateTime? StartDateUtc { get; set; } 

    public DateTime? EndDateUtc { get; set; } 

    public bool RequiresCouponCode { get; set; } 

    [StringLength(100)] 
    public string CouponCode { get; set; } 

    public int DiscountLimitationId { get; set; } 

    public int LimitationTimes { get; set; } 

    public int? MaximumDiscountedQuantity { get; set; } 

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<DiscountRequirement> DiscountRequirements { get; set; } 

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<DiscountUsageHistory> DiscountUsageHistories { get; set; } 

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<Category> Categories { get; set; } 

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<Product> Products { get; set; } 
} 

Product_Category_Mapping Class Definition

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.ComponentModel.DataAnnotations.Schema; 
using System.Data.Entity.Spatial; 

public partial class Product_Category_Mapping 
{ 
    public int Id { get; set; } 

    public int ProductId { get; set; } 

    public int CategoryId { get; set; } 

    public bool IsFeaturedProduct { get; set; } 

    public int DisplayOrder { get; set; } 

    public virtual Category Category { get; set; } 

    public virtual Product Product { get; set; } 
} 
+0

Können Sie Beispiel mit XML hinzufügen? Und wer sollte das Endergebnis (die Liste der XElement) halten? Katzen? – KernelMode

+0

Es muss eine XML-Zeichenfolge mit allen Kategorien und Eigenschaften erstellt werden. – Orion

Antwort

0

So brauchen Sie eigentlich XML-String, wird einfachste Weg, einfache XML-Serialisierung sein. Z.B. wenn Sie folgende Kategorien haben:

var cats = new List<Category> { 
    new Category { Id = 1, Name = "Auto", Description = "blah-blah-blah" }, 
    new Category { Id = 2, Name = "Moto", Description = "bikes!" } 
}; 

Serialisierung aussehen wird

var serializer = new XmlSerializer(typeof(List<Category>), 
            new XmlRootAttribute("Categories")); 
using (var writer = new StringWriter()) 
{ 
    serializer.Serialize(writer, cats); 
    return writer.ToString(); 
} 

Ausgang:

<?xml version="1.0" encoding="utf-16"?> 
<Categories xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Category> 
    <Id>1</Id> 
    <Name>Auto</Name> 
    <Description>blah-blah-blah</Description> 
    </Category> 
    <Category> 
    <Id>2</Id> 
    <Name>Moto</Name> 
    <Description>bikes!</Description> 
    </Category> 
</Categories> 
+0

Ich erhalte den folgenden Fehler: "System.Web.Services.Protocols.SoapException: Der Server konnte die Anfrage nicht verarbeiten. ---> System.InvalidOperationException: Es ist ein Fehler aufgetreten, der den Typ 'System.Collections.Generic.List' widerspiegelt von einem Web-Service angerufen werden. – Orion

+0

@Orion Können Sie Ihrer Frage 'Category' Klassendefinition hinzufügen? –

+0

@Serygey siehe Bearbeiten. – Orion

1

Verwenden Sie die OuterXml Eigenschaft des Knotens. Es wird genau das zurückgeben, was Sie wollen.

return Configuration.OuterXml; 
+1

'Select (c => neues XElement (" Element ", c))' gibt Ihnen Namen von Klassen anstelle von Werten von Eigenschaften –

+0

OP hat 'Configuration' als' XElement' definiert, also sollte oben funktionieren. –

+0

Bitte denken Sie über den Inhalt dieses XElement –

0

Dies ist die beste Lösung, die ich mir vorstellen konnte. Es funktioniert und wird es als meine Antwort akzeptieren.

// GETAll api/category 
    [WebMethod] 
    public string GetAllCategories() 
    { 
     using (var db = new nopMass()) 
     { 
      var cats = db.Categories 
         .Where(x => x.ParentCategoryId == 1 
            && x.Deleted == false 
            && x.Published == true) 
         .OrderBy(c => c.ParentCategoryId) 
         .ThenBy(c => c.DisplayOrder) 
         .AsEnumerable() 
         .Select(cat => new Category 
         { 
          Id = cat.Id, 
          Name = cat.Name, 
          Description = cat.Description, 
          MetaKeywords = cat.MetaKeywords, 
          MetaDescription = cat.MetaDescription, 
          MetaTitle = cat.MetaTitle, 
          PictureId = cat.PictureId, 
          DisplayOrder = cat.DisplayOrder, 
          CreatedOnUtc = cat.CreatedOnUtc, 
          Product_Category_Mapping = cat.Product_Category_Mapping, 
          ParentCategoryId = cat.ParentCategoryId, 
         }) 
         .ToList(); 

      string XML = ""; 

      #region BuildXMLString 

      XML += "<Collection>"; 
      foreach (var item in cats) 
      { 
       XML += "<Category>"; 

       XML += "<Id>"; 
       XML += item.Id.ToString(); 
       XML += "</Id>"; 

       XML += "<Name>"; 
       XML += item.Name; 
       XML += "</Name>"; 

       XML += "<Description>"; 
       XML += item.Description; 
       XML += "</Description>"; 

       XML += "<MetaKeywords>"; 
       XML += item.MetaKeywords; 
       XML += "</MetaKeywords>"; 

       XML += "<MetaDescription>"; 
       XML += item.MetaDescription; 
       XML += "</MetaDescription>"; 

       XML += "<MetaTitle>"; 
       XML += item.MetaTitle; 
       XML += "</MetaTitle>"; 

       XML += "<PictureUrl>"; 
       try 
       { 
        XML += GetPictureUrl(item.PictureId); 
       } 
       catch { } 
       XML += "</PictureUrl>"; 

       XML += "<DisplayOrder>"; 
       XML += item.DisplayOrder.ToString(); 
       XML += "</DisplayOrder>"; 

       XML += "<CreatedOnUtc>"; 
       XML += item.CreatedOnUtc.ToString(); 
       XML += "</CreatedOnUtc>"; 

       XML += "<ParentCategoryId>"; 
       XML += item.ParentCategoryId.ToString(); 
       XML += "</ParentCategoryId>"; 

       XML += "</Category>"; 
      } 
      XML += "</Collection>"; 

      #endregion 

      return XML; 

     } 
    }