Ниже приведены проблемы с LINQ to XML:
Есть ли способ вернуть перечисление атрибутов, чтобы мне не пришлось делать цикл foreach?
Он должен возвращать только те элементы, которые имеют кардное число от 13 до 16 цифр, но, похоже, он возвращает числа длиннее? Почему?
Является ли long.TryParse лучший способ проверить, является ли 16-значный номер на самом деле число?
Кроме того, возможно ли вернуть не только элементы, которые имеют атрибуты с 16-значными числами, но также элементы с внутренним текстом, например <ccnum>1234567890123456</ccnum>
, а затем проанализировать каждый дочерний узел родительского узла <ccnum>
, так, например, XML будет выглядеть так:
<details>
<ccnum>283838383838383838</ccnum>
<cvv>399</cvv>
<exp>0202</exp>
<name>joe</name>
</details>
Вот код:
long numeric;
string xml = @"<Details>
<CreditCard cardnum='1234888888823456'
ccv='123'
exp='0212'
cardType='1'
name='joe' />
<CreditCard cardnum='123488888882345633333'
ccv='123'
exp='0212'
cardType='1'
name='joe' />
</Details>";
XElement element = XElement.Parse(xml);
IEnumerable<XElement> elementsWithPossibleCCNumbers =
element.Descendants()
.Where(d => d.Attributes()
.Where(a => a.Value.Length >= 13 && a.Value.Length <= 16)
.Where(a => long.TryParse(a.Value, out numeric))
.Count() == 1).Select(x=>x);
foreach(var x in elementsWithPossibleCCNumbers)
{
foreach(var a in x.Attributes())
{
//Check if the value is a number
if(long.TryParse(a.Value,out numeric))
{
//Check if value is the credit card
if(a.Value.Length >= 13 && a.Value.Length <= 16)
xml = xml.Replace(a.Value, string.Concat(new String('*',a.Value.Length - 4),a.Value.Substring(a.Value.Length - 4)));
else //If value is not a credit card, replace it with ***
xml = xml.Replace(a.Value, "***");
}
}
}
ОК, я понял, почему мне показалось, что он возвращает число длиннее 16, потому что первые 16 цифр совпадают с первым числом, и я просто заменяю эту часть, так что я думаю, что это вызывает Вопрос о том, как просто обновить правильный атрибут.
Есть ли решение для обновления целого числа - использовать границу регулярного выражения?