c# - 从 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>
解决方案
使用 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);
}
}
}
推荐阅读
- javascript - 如何在页面加载时开始执行 javascript 代码?
- excel - 在我的字段“vendor”中隐藏我的数据透视表中包含“JVPDML”一词的行
- spring - Apache Ignite CPU 问题
- python - 按行将列名从 DataFrame 提取到 Series
- mysql - Mysql 在函数中截断了不正确的 DOUBLE 值
- c# - 无法在 ASP.NET MVC 应用程序中登录和注册,但能够访问其他数据
- types - SPARQL:忽略查询中值的数据类型
- python - PySpark 对排序后的内容进行排序
- ruby - 在 Jekyll 中使用子页面的集合会导致 Liquid 异常
- python - iterrows() :对每一行给出相同的结果