users@saaj.java.net

Removing xmlns attribute

From: Sami Lakka <sami.lakka_at_tut.fi>
Date: Fri, 18 Mar 2005 14:41:20 +0200

Hi,

 

 

I have to remove xmlns attributes from SOAP stream using SAAJ. Basically the
idea is that if I currently have following SOAP stream:

 

<Value xsi:type="ns0:ArrayOfString">

<string xmlns="http://www.w3.org/2001/XMLSchema">Value2</string>

<string xmlns="http://www.w3.org/2001/XMLSchema">Value3</string>

</Value>

 

The stream should be after my handler as follows:

 

<Value xsi:type="ns0:ArrayOfString">

<string>Value2</string>

<string>Value3</string>

</Value>

 

 

I found that the removing of the xmlns- attributes is easy but for some
reason the namespace declaration is still in the stream when it is sent to
the

client. Isn't enough that the xmlns- attribute is removed or do I have to do
something else. I'm using folloing code to test my algorithm (JWSDP-1.5)

 

 

/*

 * Created on 18.3.2005

 */

package tests.com.wa.xmlda.webservice.jwsdp;

 

import java.util.Iterator;

 

import javax.xml.soap.MessageFactory;

import javax.xml.soap.Name;

import javax.xml.soap.SOAPElement;

import javax.xml.soap.SOAPException;

import javax.xml.soap.SOAPFactory;

import javax.xml.soap.SOAPMessage;

 

import org.w3c.dom.Attr;

import org.w3c.dom.NamedNodeMap;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

 

import com.wa.xmlda.ctxmanagement.IXMLDAConstants;

 

/**

 * @author Sami Lakka

 */

public class ArrayTester {

 

                      public static void main(String[] args) {

                                            try {

 
MessageFactory factory = MessageFactory.newInstance();

                                                                 SOAPMessage
message = factory.createMessage();

                                                                 

                                                                 SOAPFactory
soapFactory = SOAPFactory.newInstance();

                                                                 String[]
arrayOfStrings = new String[] {"Value1","Value2",

 
"Value3"};

                                                                 

                                                                 Name
valueName = soapFactory.createName("Value", "ns0",

 
IXMLDAConstants.XMLDA_NAMESPACE);

 

                                                                 Name
typeAttributeName = soapFactory.createName("type", "xsi",

 
"http://www.w3.org/2001/XMLSchema-instance");

 

                                                                 SOAPElement
element = soapFactory.createElement(valueName);


 
element.addAttribute(typeAttributeName, "ns0:ArrayOfString");

                                                                 

                                                                 for (int i
= 0; i < arrayOfStrings.length; i++) {

 
String stringItem = arrayOfStrings[i];

 


 
Name name =
soapFactory.createName("string","","http://www.w3.org/2001/XMLSchema");


 
SOAPElement arrayCell = element.addChildElement(name);

 
arrayCell.addTextNode(stringItem);

                                                                 }

                                                                 

 
message.getSOAPBody().addChildElement(element);

                                                                 

                                                                 

 
findNamespace(element);

 
message.writeTo(System.out);

 
System.out.write("\r\n".getBytes());

                                                                 

                                            } catch (SOAPException e) {

 
e.printStackTrace();

                                            } catch (Exception e) {

 
e.printStackTrace();

                                            }

                      }

                      

                      private static void findNamespace(Node item) {

                                            NodeList children =
item.getChildNodes();

 


                                            for (int i = 0; i
<children.getLength(); i++) {

                                                                 Node child
= children.item(i);

 


                                                                 if
("http://www.w3.org/2001/XMLSchema".equals(child.getNamespaceURI())) {

 
SOAPElement elem = (SOAPElement) child;

 


 
Iterator iter = elem.getAllAttributes();

 


 
for (;iter.hasNext();) {

 
Name name = (Name) iter.next();


 
Attr attribute = elem.getAttributeNode(name.getLocalName());


 
elem.removeAttributeNode(attribute);

 
System.out.println("Removed attribute: "+attribute.getLocalName());

 
}


                                                                 }

                                                                 

                                                                 

 
NamedNodeMap attributes = child.getAttributes();

                                                                 

                                                                 if
(attributes != null) {

 
for (int j = 0; j < attributes.getLength(); j++) {


 
findNamespace(attributes.item(j));


 
}

                                                                 }

                                                                 

 
findNamespace(child);

                                            }

                      }

}