Axiom OMElement генерирует дочерний элемент с пустым пространством имен по умолчанию

Привет, это то, что я делаю для создания XML-кода:

OMFactory factory = OMAbstractFactory.getOMFactory();
OMNamespace nsSequence = factory.createOMNamespace("http://ws.apache.org/ns/synapse", "");
OMElement rootSequence = factory.createOMElement("sequence",nsSequence);


/*<FILTER>*/
OMNamespace nsFilter = factory.createOMNamespace("http://org.apache.synapse/xsd", "ns");        
OMElement filter = factory.createOMElement("filter",nsFilter);
OMAttribute regex = factory.createOMAttribute("regex", null, "applID");
OMAttribute source = factory.createOMAttribute("source", null, "get-property('applicationID')");

filter.addAttribute(regex);
filter.addAttribute(source);

/*<THEN>*/
OMElement then = factory.createOMElement("then",null);          

filter.addChild(then);
rootSequence.addChild(filter);

сгенерированный код похож на этот:

<sequence xmlns="http://ws.apache.org/ns/synapse">
    <ns:filter xmlns:ns="http://org.apache.synapse/xsd" regex="APPP" source="get-property('applicationID')">
        <then xmlns=""></then>
    </ns:filter>
</sequence>

XMLNS="" внутри элемента THEN для меня большая проблема.

я использую axiom-api 1.2.14... и я где-то читал, что это проблема (ошибка), с которой столкнулись другие (может быть, уже решил?). Есть ли способ обойти эту проблему, чтобы получить чистый код xml? или лучше решить?


person Alex    schedule 26.01.2015    source источник
comment
обходным путем является добавление пространства имен в качестве атрибута: OMAttribute ns = factory.createOMAttribute(xmlns:ns, null, org .apache.synapse/xsd); filter.addAttribute(ns);... этот способ должен работать... но я думаю, что это ошибка, о которой следует сообщить.   -  person Alex    schedule 27.01.2015


Ответы (1)


Вы создаете элемент then без пространства имен:

OMElement then = factory.createOMElement("then", null);

Поэтому Axiom генерирует xmlns="", чтобы у элемента не было пространства имен, как вы и просили. Фактически, без xmlns="" у элемента было бы пространство имен по умолчанию http://ws.apache.org/ns/synapse, что было бы неправильно.

Если вы считаете, что объявление пространства имен неверно, то это, вероятно, означает, что элемент на самом деле должен принадлежать одному из других пространств имен, используемых в документе. Если это так, вам следует исправить код, чтобы запрашивать элемент в правильном пространстве имен.

person Andreas Veithen    schedule 27.01.2015
comment
На самом деле мне нужна аксиома, чтобы не переопределять пространство имен по умолчанию, объявленное в родительском узле. Написание xmlns= так и есть. Такое поведение существует в предыдущем выпуске axiom API, как описано здесь:issues.apache.org/jira/ browse/AXIOM-28, связанный с методом setDefaultNamespace. Итак, дело в том, позволяет ли аксиома создавать элемент без спецификации пространства имен по умолчанию. Как написано в приведенной выше ссылке jira, способ обойти проблему - указать пространства имен в качестве атрибута. - person Alex; 27.01.2015
comment
Как я уже сказал, это не ошибка. Axiom строго выполняет то, что требует ваш код. Если результат не соответствует вашим ожиданиям, исправьте свой код. - person Andreas Veithen; 27.01.2015
comment
не могли бы вы написать пример кода, чтобы получить это? ‹последовательность xmlns=ws.apache.org/ns/synapse›‹filter xmlns :ns=org.apache.synapse/xsd regex=APPP source=get-property('applicationID' )›‹затем›‹/затем›‹фильтр›‹/последовательность› ... я пытаюсь понять, что мне нужно исправить. - person Alex; 27.01.2015
comment
спасибо... ты был прав... теперь я понимаю. Оно работает - person Alex; 28.01.2015