掩码元素属性值,使用Linq

本文关键字:使用 Linq 元素 属性 掩码 | 更新日期: 2023-09-27 18:22:31

我有一个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>"

掩码元素属性值,使用Linq

首先,对所有实际的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.

var unsecureElements = 
    XElement.Parse(xml)
            .Descendants()
            .Where(n => blackList.Contains(n.Name.LocalName.ToLower()));
foreach (var element in unsecureElements)
{
    var valueAttribute = element.Attribute("value");
    if (valueAttribute != null) // check if unsecure element has value attribute
        valueAttribute.SetValue("RemovedForSecurity");
    else
        element.Value = "RemovedForSecurity";
}