Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> javax правильно построить иерархию элементов, addChildElement задает лишний атрибут 
V
    Опции темы
EgoBrain
Дата 31.1.2017, 03:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: нет
Всего: 2



Добрый день!
Проблема такого характера: при подключении дочернего элемента SOAPElement к родительскому SOAPElement у дочернего создается свойство xmlns="", в моем случае данный эффект является не приемлемым. Как от этого избавится?

Код

...
SOAPFactory factory = SOAPFactory.newInstance();
SOAPElement securityElem = factory.createElement("Security", null, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
SOAPElement tokenElem = factory.createElement("UsernameToken");

...

securityElem.addChildElement(tokenElem); //Теперь у элемента tokenElem появилось свойство xmlns=""


Результат работы программы:
Код

<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
            <UsernameToken xmlns=""/>
</Security>


Требуемый результат:
Код

<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
            <UsernameToken/>
</Security>


Очень прошу помочь  smile 
PM MAIL ICQ Skype   Вверх
TiKKi
Дата 31.1.2017, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 13.5.2006

Репутация: нет
Всего: 2



Я так понимаю, вам нужна xml-канонизация. Попробуйте применить к элементу метод:
Код

import org.apache.xml.security.c14n.Canonicalizer;

Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_EXCL_OMIT_COMMENTS).canonicalizeSubtree(securityElem);


Это сообщение отредактировал(а) TiKKi - 31.1.2017, 08:33
PM   Вверх
EgoBrain
Дата 31.1.2017, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: нет
Всего: 2



Цитата(TiKKi @ 31.1.2017,  16:30)
Я так понимаю, вам нужна xml-канонизация. Попробуйте применить к элементу метод:
Код

import org.apache.xml.security.c14n.Canonicalizer;

Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_EXCL_OMIT_COMMENTS).canonicalizeSubtree(securityElem);

Спасибо за ответ!
Получаю ошибку
Цитата

Exception in handler: com.sun.org.apache.xml.internal.security.c14n.InvalidCanonicalizerException: Unknown canonicalizer. No handler installed for URI http://www.w3.org/2001/10/xml-exc-c14n#

PM MAIL ICQ Skype   Вверх
TiKKi
Дата 31.1.2017, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 13.5.2006

Репутация: нет
Всего: 2



Скорей всего не проинициализировали библиотеку
Код

org.apache.xml.security.Init.init();


Это сообщение отредактировал(а) TiKKi - 31.1.2017, 09:24
PM   Вверх
EgoBrain
Дата 31.1.2017, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: нет
Всего: 2



Цитата(TiKKi @ 31.1.2017,  17:23)
Скорей всего не проинициализировали библиотеку
Код

org.apache.xml.security.Init.init();

Действительно нужно было сделать инициализация чтобы она не значила.
Но канониколизация к сожалению не возымела действия.
Причем пробовал производить её над разными элементами, и над всеми элементами, составляющими документ, над самим tokenElem и над его предками.

Добавлено через 1 минуту и 41 секунду
Может быть есть способ каким то образом "вручную" отредактировать сформированный SOAPElement или составленный из них SOAPHeader?
PM MAIL ICQ Skype   Вверх
TiKKi
  Дата 31.1.2017, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 13.5.2006

Репутация: нет
Всего: 2



Вроде работает
Код

package test.rt.eu.nr;

import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.xml.security.c14n.Canonicalizer;
import org.junit.Test;

public class XmlCanonTest {

    @Test
    public void name() throws Exception {

        org.apache.xml.security.Init.init();

        SOAPFactory factory = SOAPFactory.newInstance();
        SOAPElement securityElem = factory.createElement("Security");
        securityElem.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
        SOAPElement tokenElem = factory.createElement("UsernameToken");
        tokenElem.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns", "");
        securityElem.addChildElement(tokenElem);

        byte[] canonicalizeSubtree = Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_EXCL_OMIT_COMMENTS)
                .canonicalizeSubtree(securityElem, "", false);

        System.out.println(new String(canonicalizeSubtree, StandardCharsets.UTF_8));

        try {
            Transformer transformer = TransformerFactory.newInstance().newTransformer();
            StringWriter stringWriter = new StringWriter();
            transformer.transform(new DOMSource(securityElem), new StreamResult(stringWriter));
            System.out.println(stringWriter.toString());
        } catch (TransformerException e) {
            e.printStackTrace();
        }
    }
}


Цитата

Может быть есть способ каким то образом "вручную" отредактировать сформированный SOAPElement или составленный из них SOAPHeader?

Делали как-то такое, использовали XPathAPI из Apache Xalan.

Это сообщение отредактировал(а) TiKKi - 31.1.2017, 10:04
PM   Вверх
EgoBrain
Дата 31.1.2017, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: нет
Всего: 2



Цитата(TiKKi @ 31.1.2017,  17:59)
Вроде работает

Ок, получил каноникализированный элемент в виде строки
Цитата

StringWriter stringWriter

Цитата

byte[] canonicalizeSubtree

Как сделать так, чтобы мой элемент SOAPElement tokenElem тоже изменился в соответствии с проведенными манипуляциями?
Код

String uri = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
SOAPElement securityElem = factory.createElement("Security", prefix, uri);

SOAPElement tokenElem = factory.createElement("UsernameToken");
SOAPElement usrname = factory.createElement("Username");
usrname.setValue("123");
SOAPElement pwd = factory.createElement("Password");
QName attributeName = new QName("Type");
pwd.addAttribute(attributeName, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
pwd.setValue("123");

tokenElem.addChildElement(usrname);
tokenElem.addChildElement(pwd);
securityElem.addChildElement(tokenElem);

com.sun.org.apache.xml.internal.security.Init.init();
byte[] canonicalizeSubtree = Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_EXCL_OMIT_COMMENTS)
                        .canonicalizeSubtree(securityElem); //Результат каноникализации был помещен в byte[], элемент tokenElem и securityElem остался без изменений

SOAPHeader header = envelope.addHeader();
header.addChildElement(messageID);
header.addChildElement(securityElem);


Это сообщение отредактировал(а) EgoBrain - 31.1.2017, 10:19
PM MAIL ICQ Skype   Вверх
EgoBrain
Дата 1.2.2017, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: нет
Всего: 2



Цитата(EgoBrain @ 31.1.2017,  17:34)
Может быть есть способ каким то образом "вручную" отредактировать сформированный SOAPElement или составленный из них SOAPHeader?

Интересный вопрос, но уже для отдельной темы имхо.

А моя задача была решена следующим образом
Цитата

If you want the element to be in the same namespace as its parent element, you must explicitly create it in that namespace by supplying the URI to the createElement() call. If you create a no-namespace element (as you have done), then the serializer inserts a namespace undeclaration xmlns="" to indicate that that the element is not in the same namespace as its parent.
Michael Kay


Код

String uri = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
SOAPElement securityElem = factory.createElement("Security", prefix, uri);
SOAPElement tokenElem = factory.createElement("UsernameToken", prefix, uri);
SOAPElement usrname = factory.createElement("Username");
usrname.setValue("123");
SOAPElement pwd = factory.createElement("Password");
QName attributeName = new QName("Type");
pwd.addAttribute(attributeName, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
pwd.setValue("123");

tokenElem.addChildElement(usrname);
tokenElem.addChildElement(pwd);
securityElem.addChildElement(tokenElem);


Код

<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
            <UsernameToken>
                <Username xmlns="">123</Username>
                <Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText" xmlns="">123</Password>
            </UsernameToken>
</Security>

PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1566 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.