c# - 屏蔽元素\属性值,使用Linq

标签 c# linq

我有一个 xml 字符串,其中包含我想要屏蔽的某些值。我还有一个黑名单列表,其中包含我要屏蔽的元素或属性的名称。我如何使用 Linq 执行此操作?

var BlackList=new List<string>{"ssn", "dateofbirth"};

var xml=@"<Rows><Row><SSN>123-12-1234</SSN><Address>123 Somewhere Street</Address><DateOfBirth>12-12-2012</DateOfBirth></Row><Row><SSN value=""123-12-1234""/><Address value=""123 Somewhere Street""/><DateOfBirth value=""12-12-2012""/></Row></Rows>";

结果集看起来像这样:

"<Rows><Row><SSN>RemovedForSecurity</SSN><Address>123 Somewhere Street</Address><DateOfBirth>RemovedForSecurity</DateOfBirth></Row><Row><SSN value="RemovedForSecurity"/><Address value="123 Somewhere Street"/><DateOfBirth value="RemovedForSecurity"/></Row></Rows>"

最佳答案

首先,对所有实际的 XML 使用 LINQ to XML。您以字符串开始并以字符串结束这一事实是偶然的:您实际上是在尝试操作 XML 文档。在这一点上它相当容易:

var redactedElements = new HashSet<XName>
{
    "SSN",
    "CreditCard"
};
var redactedAttributes = new HashSet<XName>
{
    "dateofbirth",
    ...
};

var elements = doc.Descendants()
                  .Where(x => redactedElements.Contains(x.Name))
                  .ToList();
foreach (var element in elements)
{
    element.Value = "RemovedForSecurity";
}

var attributes = doc.Descendants()
                    .Attributes()
                    .Where(x => redactedAttributes.Contains(x.Name))
                    .ToList();
foreach (var attribute in attributes)
{
    attribute.Value = "RemovedForSecurity";
}

编辑:为了不区分大小写,您将保留一个不区分大小写的本地名称列表:

var redactedElements = new HashSet<string>(StringEqualityComparer.OrdinalIgnoreCase);
{
    "SSN",
    "CreditCard"
};
var elements = doc.Descendants()
                  .Where(x => redactedElements.Contains(x.Name.LocalName))
                  .ToList();
// Ditto for the attributes

不过,如果您指定确切的名称会更好,IMO。

关于c# - 屏蔽元素\属性值,使用Linq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17664224/

相关文章:

c# - C#从字符串中提取十进制数

c# - 对 ASP.NET 的 Javascript 函数调用

c# - 从其他应用程序的入口点启动应用程序android

c# - 在 C# 中,如何使用十六进制值创建 System.Drawing.Color 对象?

c# - 如何使用 linq to xml 创建多态数组?

linq - 如何使用 MethodCallExpression.Update

c# - 获取特定标准和其他标准的计数和平均值

c# - 是否可以在 My Sql 数据库中保存文件指针?

c# - 这两个 LINQ 查询有什么区别?

c# - CRM 2016 RetrieveMultiple 用于过滤电子邮件的插件