下面是與LINQ的問題,以下XML:如何將此linq改進爲xml?
有沒有辦法返回屬性的枚舉,所以我沒有做foreach循環?
它應該只返回具有13到16位數之間的cardnum的元素,但它看起來是返回的數字比那更長?爲什麼?
是long.TryParse測試16位數字實際上是否是數字的最佳方法?
此外,是否有可能返回不僅有16位數字屬性的元素,而且還與內文如
<ccnum>123456789</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位數字與第一個數字相同,我只是替換該部分,所以我想這引起了一個問題如何更新正確的屬性。
更新整數的解決方案是使用正則表達式邊界?
UMH你爲什麼不直接返回了'ccnum'元素的值?這裏你不是真的「使用」XML。 – BrokenGlass 2012-02-01 20:07:16
@BrokenGlass - 因爲它在所有情況下都不叫ccnum,所以我按照它的長度來確定持有信用卡數據的元素/屬性。 – Xaisoft 2012-02-01 20:08:53
雖然這是可能的,但它真的在我看來打敗了目的 – BrokenGlass 2012-02-01 20:10:29