0 votes

comment fusionner des éléments en fonction d'une condition dans xelemnt ?

J'ai un exemple de xelement :

<Books>
  <Book>
    <Id>123</Id>
    <EndDate>01/11/2009</EndDate>
    <Price>$0.00</Price>
    <tag1>0</tag1>
    <tag2>0</tag2>
   </Book>
   <Book>
    <Id>567</Id>
    <EndDate>01/01/2001</EndDate>
    <Price>$0.00</Price>
    <tag1>1</tag1>
     <tag2>2</tag2>
   </Book>
   <Book>
    <Id>567</Id>
    <EndDate>01/01/2001</EndDate>
     <tag1>22</tag1>
     <tag2>33</tag2>
    <Price>$0.00</Price>
    </Book>
</Books>

Je dois fusionner 2 noeuds (avec coma séparé) quand les dates de fin sont les mêmes. Pour l'entrée ci-dessus je devrais obtenir les résultats suivants.

<Books>
  <Book>
    <Id>123</Id>
    <EndDate>01/11/2009</EndDate>
    <Price>$0.00</Price>
    <tag1>0</tag1>
    <tag2>0</tag2>
   </Book>
   <Book>
    <Id>567</Id>
    <EndDate>01/01/2001</EndDate>
    <Price>$0.00</Price>
    <tag1>1,22</tag1>
     <tag2>2,33</tag2>
   </Book>
  </Books>

J'ai essayé d'utiliser la fonction d'agrégation mais je ne suis pas en mesure d'ajouter la condition de date de fin.

0voto

Waleed A.K. Points 426

Sérialisation google XML en C#.

  1. Désérialisez le fichier xml en List comme exemple.
  2. Faites votre logique "supprimer un enregistrement ou créer une nouvelle liste fusionnée".
  3. Sérialiser la nouvelle liste dans un fichier xml

ou

public class Book
{
  public int Id { get; set; }
  public Decimal Price { get; set; }
  public DateTime EndDate{ get; set; }
  public string tag1{ get; set; }
  public string tag1{ get; set; }
}
....

XDocument xmlDoc = XDocument.Load("Books.xml");
List<Book> BookList1=
  (from Book in xmlDoc.Descendants("Book")
   select new Tutorial
   {
     Id = tutorial.Element("Id").Value,
     Price = tutorial.Element("Price").Value,
     EndDate = DateTime.Parse(tutorial.Element("EndDate").Value),
     tag1= tutorial.Element("tag1").Value,
     tag2= tutorial.Element("tag2").Value
   }).ToList<Tutorial>();
....
var BookGroups = from g in  BookList1 group g by Id into g
select new{Key=g.Key,Books=g};

List<Book> BookList2= new List<Book>();
foreach(var g in BookGroups)
{ 
  Book book = new Book();
  book.Id=g.Key;
  foreach(var b in g.Books)
  {
// put your logic 
  if(b.Price > book.Price) book.Price =b.Price;
  if(b.EndDate > book.EndDate) book.EndDate =b.EndDate;
  book.tag1+=b.tag1+",";
  book.tag2+=b.tag2+",";
 }
 book.tag1= book.tag1.Trim(',');
 book.tag2= book.tag2.Trim(',');
 BookList2.add(book);
}

0voto

dommer Points 11550

Le schéma suivant peut vous aider à démarrer (illustration - pas de qualité de production) :

// XElement sourceElement contains the original "Books" element.

var matchingBookGroups = 
    from x in sourceElement.Elements("Book")
    group x by string.Format("{0}-{1}", x.Element("Id").Value, x.Element("EndDate").Value) into g
    select new { Key = g.Key, Values = g };

XElement result =
    new XElement("Books",
        from matchingBookElements in matchingBookGroups
        let firstMatchingBookElement = matchingBookElements.Values.First()
        select
            new XElement("Book",
                firstMatchingBookElement.Element("Id"),
                firstMatchingBookElement.Element("EndDate"),
                firstMatchingBookElement.Element("Price"),
                    new XElement("tag1", string.Join(",", matchingBookElements.Values.Elements("tag1").Select(x => x.Value).ToArray())),
                    new XElement("tag2", string.Join(",", matchingBookElements.Values.Elements("tag2").Select(x => x.Value).ToArray()))));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X