首页 > 解决方案 > 从 XML 中检索 XElement,而不从 XDcoument 中删除它们

问题描述

我一直致力于从 XML 字符串中检索几个 XML 节点。我的要求是检索与列表项不匹配的 XML 节点。我能够从 XML 中删除 ChildNode,但无法找到解决方案来检索与列表项不匹配的 childNode。

下面是我的课

    public class MovieDetails 
        {
            public string MovieName { get; set; }
            public string MovieId { get; set; }
            public string MovieGenre { get; set; }
        }

   public class AdditionalInformation {

         public string MovieInformation {get;set;}
   }

我的 XML:

<MovieContent>
  <MovieDetails>
      <MovieName>Movie_Name_1</MovieName>
      <MovieId>MovieId_1</MovieId>
      <MovieGenre>MovieGenre_3</MovieGenre>
      <AdditionalInformation>HAHAHHAHA</AdditionalInformation>
  </MovieDetails>
  <MovieDetails>
      <MovieName>Movie_Name_2</MovieName>
      <MovieId>MovieId_2</MovieId>
      <MovieGenre>MovieGenre_3</MovieGenre> 
      <AdditionalInformation>FOOOO</AdditionalInformation>
  </MovieDetails>
  <MovieDetails>
      <MovieName>Movie_Name_3</MovieName>
      <MovieId>MovieId_3</MovieId>
      <MovieGenre>MovieGenre_3</MovieGenre> 
      <AdditionalInformation></AdditionalInformation>
  </MovieDetails>
</MovieContent>

我尝试使用 Linq,但无法获得我想要的结果。

var properties = new HashSet<string> { "MovieName", "MovieId", "MovieGenre" };
var Descendants = testDoc.Descendants("MovieDetailsMovieDetails");
var infoList    =  Descendants.Elements()
                             .Where(e => properties.Contains(e.Name.LocalName));

任何人都可以在不使用 Remove() 的情况下帮助实现以下结果 xml

结果 XML:

    <MovieContent>
      <MovieDetails>
           <AdditionalInformation>HAHAHHAHA</AdditionalInformation>
      </MovieDetails>
      <MovieDetails>
            <AdditionalInformation>FOOOO</AdditionalInformation>
      </MovieDetails>
      <MovieDetails>
            <AdditionalInformation></AdditionalInformation>
      </MovieDetails>
    </MovieContent>

标签: c#.netxmlasp.net-corec#-4.0

解决方案


使用 IEquable :

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

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

            XDocument doc = XDocument.Load(FILENAME);

            List<MovieDetails> details = doc.Descendants("MovieDetails").Select(x => new MovieDetails()
            {
                MovieName = (string)x.Element("MovieName"),
                MovieId = (string)x.Element("MovieId"),
                MovieGenre = (string)x.Element("MovieGenre")
            }).ToList();

            MovieDetails properties = new MovieDetails() { MovieName = "Movie_Name_1", MovieId = "MovieId_1", MovieGenre = "MovieGenre_3" };

            List<MovieDetails> newDetails = details.Where(x => !x.Equals(properties)).ToList();

        }

    }
    public class MovieDetails :  IEquatable<MovieDetails>
    {
        public string MovieName { get; set; }
        public string MovieId { get; set; }
        public string MovieGenre { get; set; }

        public Boolean Equals(MovieDetails other)
        {
            MovieDetails detail = other as MovieDetails;

            return  (this.MovieName == other.MovieName) && (this.MovieId == detail.MovieId) && (this.MovieGenre == detail.MovieGenre);
        }
    }
}

推荐阅读