Я хочу использовать регулярное выражение, чтобы найти родительский узел 16 числа цифр и вернуть всю эту секцию, но не могу понять, как, так Дано:Как я могу заставить регулярное выражение работать?
<Details>
<CreditCard cardnum="123456789" ccv="123" exp="0212" cardType="1" name="joe" />
</Details>
Я хочу вернуться:
<CreditCard cardnum="123456789" ccv="123" exp="0212" cardType="1" name="joe" />
Затем я собираюсь использовать синтаксический анализ xml и получить каждый атрибут, который является числом, и удалить его.
Я пробовал .*(\d{13,16}).*
, но это получает каждый символ.
После того, я:
XElement element = XElement.Parse(xml); // XDocument.Load(xmlFile).Root
IEnumerable<XElement> elementsWithPossibleCCNumbers =
element.Descendants()
.Where(d => d.Attributes()
.Where(a => a.Value.Length == 16)
.Count() == 1);
Я не могу понять, как цикл через каждый атрибут в elementsWithPossibleCCNumbers, например:
foreach(var x in elementsWithPossibleCCNumbers)
{
//If attribute is number, replace value with empty string
}
Примечание: я удалил int.TryParse для Теперь.
Я решил сделать это:
IEnumerable<XElement> elementsWithPossibleCCNumbers =
element.Descendants()
.Where(d => d.Attributes()
.Where(a => a.Value.Length >= 13 && a.Value.Length <= 16)
.Count() == 1).Select(x=>x);
foreach(var x in elementsWithPossibleCCNumbers)
{
foreach(var a in x.Attributes())
{
xml = xml.Replace(a.Value, new String('*',12));
}
}
Однако, если у меня есть второй элемент с атрибутом 16 цифр, он заменяет только часть значения атрибутов.
Когда дело доходит до RegEx я обычно полагаются на молитвы, ругань, и волшебство, прежде чем они будут работать правильно. – Yuck
Почему бы не десериализовать XML? Или используйте LINQ to XML, чтобы отбросить именно те XML-элементы, которые вам нужны? –
Если вы не хотите десериализовать, вы также можете посмотреть на использование XPath. – seanzi