• Главная
  • Карта сайта
Не найдено

Видалення тегів з XML за допомогою регулярних виразів на Java

Одного разу в проекті потрібно видалити з secure SOAP повідомлення security заголовок. Зробити це можна різними способами, однак, в даному випадку логічним було використання регулярних виразів. Відразу скажу - регулярні вирази, на мій погляд, найпотужніша технологія, яку варто уникати, якщо є можливість. Однак це лірика. Один з кращих сайтів з описом всього пов'язаного з регулярними виразами: regular-expressions.info

Приклад secure SOAP повідомлення, з якого мені потрібно було видалити заголовок, виглядає приблизно так (приклад узятий з http://msdn.microsoft.com/en-us/library/aa480522.aspx ).

&lt;? Xml version = "1.0&quot; encoding = "utf-8"?> <SOAP: Envelope xmlns: SOAP = "http://schemas.xmlsoap.org/soap/envelope/" xmlns: xsd = "http: // www.w3.org/2001/XMLSchema "xmlns: xsi =" http://www.w3.org/2001/XMLSchema-instance "> <SOAP: Header> <wssec: credentials xmlns: wssec =" http: // schemas.xmlsoap.org/ws/2001/10/security "> <ds: KeyInfo xmlns: ds =" http://www.w3.org/2000/09/xmldsig# "> <ds: X509Data> <ds: X509Certificate> MIIH1zCCBr + gAwIBA ... </ ds: X509Certificate> </ ds: X509Data> </ ds: KeyInfo> </ wssec: credentials> </ SOAP: Header> <SOAP: Body> <bp: pencilOrder xmlns: bp = "http://bobspencils.com/pencilOrders"> <bp: OrderID> 64B4A0D1-814E-4FF6-918A-DD7E7E1AECEA </ bp: OrderID> <bp: pencilType> bp: StandardNumberTwo </ bp: pencilType> <bp: quantity> 100,000 </ bp: quantity> <bank: paymentInfo xmlns: bank = "http://www.megabank.com/payspec/1.0"> <bank: PaymentAmount> $ 999.95 </ bank: PaymentAmount> <bank: CreditCardNumber> 1234123412341234 </ bank: CreditCardNumber> </ bank: paymentInfo> </ bp: pencilOrder> </ SOAP: Body> </ SOAP: Envelope>

Мені необхідно було реалізувати видалення з вищенаведеного повідомлення Security Header. Це все, що знаходиться всередині тега <SOAP: Header>.

<SOAP: Header> <wssec: credentials xmlns: wssec = "http://schemas.xmlsoap.org/ws/2001/10/security"> <ds: KeyInfo xmlns: ds = "http: //www.w3. org / 2000/09 / xmldsig # "> <ds: X509Data> <ds: X509Certificate> MIIH1zCCBr + gAwIBA ... </ ds: X509Certificate> </ ds: X509Data> </ ds: KeyInfo> </ wssec: credentials> </ SOAP: Header>

Регулярний вираз, що описує цей фрагмент коду:

"(<[^] * [:] {0,1} Header [^] *>. *? </ [^] * [:] {0,1} Header>)"

Пояснення до вираження:

Нижче код, який здійснює заміну:

Pattern pattern = Pattern.compile ( "(<[^ <>] * [:] {0,1} Header [^ <>] *>. *? </ [^ <>] * [:] {0,1 } Header>) ", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); Matcher m = pattern.matcher (testStr); if (m.find ()) {System.out.println (testStr.replace (m.group (0), "")); }

У цьому коді ключовими є опції для Pattern:

Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);

Без них робота з регулярними виразами відбувається всередині одного рядка. Це важливий підводний камінь. Далі все здавалося б очевидно, але можливо не найефективніша реалізація.

Результат роботи:

&lt;? Xml version = "1.0&quot; encoding = "utf-8"?> <SOAP: Envelope xmlns: SOAP = "http://schemas.xmlsoap.org/soap/envelope/" xmlns: xsd = "http: // www.w3.org/2001/XMLSchema "xmlns: xsi =" http://www.w3.org/2001/XMLSchema-instance "> <SOAP: Body> <bp: pencilOrder xmlns: bp =" http: // bobspencils.com/pencilOrders "> <bp: OrderID> 64B4A0D1-814E-4FF6-918A-DD7E7E1AECEA </ bp: OrderID> <bp: pencilType> bp: StandardNumberTwo </ bp: pencilType> <bp: quantity> 100,000 </ bp : quantity> <bank: paymentInfo xmlns: bank = "http://www.megabank.com/payspec/1.0"> <bank: PaymentAmount> $ 999.95 </ bank: PaymentAmount> <bank: CreditCardNumber> 1234123412341234 </ bank: CreditCardNumber > </ bank: paymentInfo> </ bp: pencilOrder> </ SOAP: Body> </ SOAP: Envelope>

Альтернативний приклад я знайшов тут . Однак змусити його працювати як треба, відразу не вдалося. Щодо можливостей Matcher-a потрібно читати документацію. Посилання нижче.

посилання

Lt;?
Quot; encoding = "utf-8"?
Quot; encoding = "utf-8"?
Провайдеры:
  • 08.09.2015

    Batyevka.NET предоставляет услуги доступа к сети Интернет на территории Соломенского района г. Киева.Наша миссия —... 
    Читать полностью

  • 08.09.2015
    IPNET

    Компания IPNET — это крупнейший оператор и технологический лидер на рынке телекоммуникаций Киева. Мы предоставляем... 
    Читать полностью

  • 08.09.2015
    Boryspil.Net

    Интернет-провайдер «Boryspil.net» начал свою работу в 2008 году и на данный момент является одним из крупнейших поставщиков... 
    Читать полностью

  • 08.09.2015
    4OKNET

    Наша компания работает в сфере телекоммуникационных услуг, а именно — предоставлении доступа в сеть интернет.Уже... 
    Читать полностью

  • 08.09.2015
    Телегруп

    ДП «Телегруп-Украина» – IT-компания с 15-летним опытом работы на рынке телекоммуникационных услуг, а также официальный... 
    Читать полностью

  • 08.09.2015
    Софтлинк

    Высокая скоростьМы являемся участником Украинского центра обмена трафиком (UA — IX) с включением 10 Гбит / сек... 
    Читать полностью