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' )›‹then›‹/then›‹filter›‹/sequence› ... опитвам се да разбера какво трябва да поправя. - person Alex; 27.01.2015
comment
thnx... ти беше прав... сега разбирам. Работи - person Alex; 28.01.2015