2013-11-26 4 views
1

У меня есть контент String, содержащий (среди других текстов) некоторый XML. Я хотел бы искать внутри этого XML для получения конфиденциальных данных о платежах, которые должны быть замаскированы (например, номер кредитной карты).Лучший способ заменить значения в XML-контенте?

Строка ни одного содержимого XML (которые я мог разобрать с помощью JAXB или траверс с йот), но также содержит другие значения, такие как заголовки, например:

Response-Code: 200 Encoding: ISO-8859-1 Content-Type: text/xml Headers: {connection=[Keep-Alive], ... <SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP:Body> ... <ns2:Payment> <ns2:CreditCard Number="1234567723" />

Что лучше найти содержимого и заменить номера, используя value.replaceAll(".", "X");? Я имею в виду, как я могу лучше всего найти эти значения для замены внутри xml?

ответ

1

Будьте осторожны при использовании ярлыков, таких как строковые или даже регулярные выражения для XML. Вы можете легко пропустить множество вариаций:

  • Number может появиться в качестве атрибута на других, чем CreditCard элементов.
  • Незначительные пробелы могут вмешиваться между элементом CreditCard и атрибутом Number.
  • Атрибут атрибута незначителен в XML, поэтому Номер может отображаться как первый атрибут один раз, но в другом положении на другом случаях.

Смотрите также Can you provide some examples of why it is hard to parse XML and HTML with a regex?

Это действительно не сложно сделать это правильно робастно:

  1. Получить сообщение XML, используя соответствующие вызовы в веб-служб рамки, или , если нужно, сканировать вперед в XML лексически.
  2. Используйте настоящий синтаксический анализатор XML. Сделайте простую модификацию общей процедуры преобразования/копирования личных данных , которая выдает все из , за исключением значения элемента/атрибута, которое вы хотите заменить.
2

Не могли бы вы попытаться получить индекс String cn = "CreditCard Number=", а затем заменить подстроку, которая начинается оттуда, и идет от 16 символов оттуда (длина номера кредитной карты) вперед?

Или я ошибаюсь, предполагая, что у вас есть весь заголовок в виде строки?

Вы также можете выполнить сопоставление шаблонов с выражением регулярного выражения.

+0

Это может работать для быстрого и грязного решения в очень узком контексте, но должно знать его [** существенные ограничения **] (http://stackoverflow.com/a/20219284/290085). – kjhughes

Смежные вопросы