cancel
Showing results for 
Search instead for 
Did you mean: 

XML creation with namespace prefix in dom with java.

former_member194481
Participant
0 Kudos

Hi Experts,

I need to create the below xml structure , but i am not able to create it exactly kindly help me in creating it.

I am able to create a below structure but without namespace prefix like URN

XML required :-

       <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:enterpri...

           <soapenv:Header>

              <urn:PackageVersionHeader>

                 <!--Zero or more repetitions:-->

                 <urn:packageVersions>

                    <urn:majorNumber>?</urn:majorNumber>

                    <urn:minorNumber>?</urn:minorNumber>

                    <urn:namespace>?</urn:namespace>

                 </urn:packageVersions>

              </urn:PackageVersionHeader>

              <urn:MruHeader>

                 <urn:updateMru>?</urn:updateMru>

              </urn:MruHeader>

              <urn:QueryOptions>

                 <!--Optional:-->

                 <urn:batchSize>?</urn:batchSize>

              </urn:QueryOptions>

              <urn:SessionHeader>

                 <urn:sessionId>?</urn:sessionId>

              </urn:SessionHeader>

           </soapenv:Header>

           <soapenv:Body>

              <urn:query>

                 <urn:queryString>?</urn:queryString>

              </urn:query>

           </soapenv:Body>

        </soapenv:Envelope>

Kindly help me in solving the issue.

Accepted Solutions (1)

Accepted Solutions (1)

markangelo_dihiansan
Active Contributor
0 Kudos

Hi Vijay,

Are you using external definitions?Setting elementFormDefault to "qualified" should do the trick. Same is the case for data types in 7.4.

Here's a sample:

Regards,

Mark

former_member194481
Participant
0 Kudos

Hi Dihiansan,

Thanks for the update, I am trying this with the new HCI . So i am not using this.

Thanks ,

Vijay

markangelo_dihiansan
Active Contributor
0 Kudos

Hi Vijay,

I've modified your code a little bit:


import java.io.*;

import java.net.MalformedURLException;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

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.cxf.binding.soap.SoapHeader;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

public class Test {

  private static Element createElement(String name, Element el, Document doc){

   Element element = doc.createElement(name);

   el.appendChild(element);

   return element;

  }

 

  private static void createElement(String name, Element el, Document doc, String value){

   Element element = doc.createElement(name);

   el.appendChild(element);

   if(!value.equals("")){

   element.setTextContent(value);

   }

  }

 

public static void main(String args[]) throws ParserConfigurationException, TransformerException, MalformedURLException{

  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

  dbf.setNamespaceAware(true);

  dbf.setIgnoringElementContentWhitespace(true);

  dbf.setValidating(false);

  DocumentBuilder db = dbf.newDocumentBuilder();

  Document doc = db.newDocument();

  Element Envelope = doc.createElementNS("http://schemas.xmlsoap.org/soap/envelope/", "Envelope");

  Envelope.setPrefix("soapenv");

  Envelope.setAttribute("xmlns:urn", "urn:enterprise.soap.sforce.com");

  Element Header=createElement("soapenv:Header",Envelope,doc);

  Element PackageVersionHeader=createElement("urn:PackageVersionHeader",Header,doc);

  Element PackageVersions=createElement("urn:PackageVersions",PackageVersionHeader,doc);

  createElement("urn:majorNumber",PackageVersions,doc,"0");

  createElement("urn:minorNumber",PackageVersions,doc,"2");

  createElement("urn:namespace",PackageVersions,doc,"Vijay");

  Element MruHeader=createElement("urn:MruHeader",Header,doc);

  createElement("urn:updateMru",MruHeader,doc,"1");

  Element QueryOptions=createElement("urn:QueryOptions",Header,doc);

  createElement("urn:batchSize",QueryOptions,doc,"1");

  Element SessionHeader=createElement("urn:SessionHeader",Header,doc);

  createElement("urn:sessionId",SessionHeader,doc,"Vijay");

 

  Element Body=createElement("soapenv:Body",Envelope,doc);

  Element query=createElement("urn:query",Body,doc);

  createElement("urn:queryString",query,doc,"queryString");

  StringWriter sw = new StringWriter();

  StreamResult result = new StreamResult(sw);

  DOMSource source = new DOMSource(Envelope);

  TransformerFactory tf =  TransformerFactory.newInstance();

  Transformer transformer = tf.newTransformer();

  transformer.transform(source, result);

  String xmlString = sw.toString();

  System.out.println(xmlString);

  }

}

Output


<?xml version="1.0" encoding="UTF-8"?>

<soapenv:Envelope xmlns:urn="urn:enterprise.soap.sforce.com" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

   <soapenv:Header>

      <urn:PackageVersionHeader>

         <urn:PackageVersions>

            <urn:majorNumber>0</urn:majorNumber>

            <urn:minorNumber>2</urn:minorNumber>

            <urn:namespace>Vijay</urn:namespace>

         </urn:PackageVersions>

      </urn:PackageVersionHeader>

      <urn:MruHeader>

         <urn:updateMru>1</urn:updateMru>

      </urn:MruHeader>

      <urn:QueryOptions>

         <urn:batchSize>1</urn:batchSize>

      </urn:QueryOptions>

      <urn:SessionHeader>

         <urn:sessionId>Vijay</urn:sessionId>

      </urn:SessionHeader>

   </soapenv:Header>

   <soapenv:Body>

      <urn:query>

         <urn:queryString>queryString</urn:queryString>

      </urn:query>

   </soapenv:Body>

</soapenv:Envelope>

Regards,

Mark

former_member194481
Participant
0 Kudos

Hi Dihiansan,

Many Thanks Dihiansan, it started working also i have learned how write as well from your code.

Also i have understand how to set prefix.

Thanks,

Vijay

Answers (1)

Answers (1)

engswee
Active Contributor
0 Kudos

Hi Vijay

Did you try using the createElementNS() method of the Document class instead of createElement()?

Document (Java Platform SE 6)

You might want to share your code if you require further help.

Rgds

Eng Swee

former_member194481
Participant
0 Kudos

Hi Yeoh,

Yes, i have tried it actually the problem is i want to declare the namespace and refer it with the prefix.

code what i have tried

import java.io.*;

import java.net.MalformedURLException;

import java.net.URL;

import java.util.ArrayList;

import java.util.List;

import javax.xml.namespace.QName;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerConfigurationException;

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.cxf.binding.soap.SoapHeader;

import org.w3c.dom.Attr;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

public class SFDC_SoapHeaders {

  public static void main(String args[]) throws ParserConfigurationException, TransformerException, MalformedURLException

  {

// URL namespaceUrl = new URL("urn:enterprise.soap.sforce.com");

// String namespaceact = "xmlns:urn="+namespaceUrl.toString();

  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

  dbf.setNamespaceAware(true);

  dbf.setIgnoringElementContentWhitespace(true);

  dbf.setValidating(false);

  DocumentBuilder db = dbf.newDocumentBuilder();

  Document doc = db.newDocument();

  //Element Envelope = doc.createElement("Envelope");

  //Envelope.setAttributeNS("http://schemas.xmlsoap.org/soap/envelope/", "Envelope", "soapenv");

  Element Header = doc.createElementNS("http://schemas.xmlsoap.org/soap/envelope/", "soapenv");

// Header.setAttribute("xmlns:soapenv", "asdsa");

// Header.setAttributeNS("http://schemas.xmlsoap.org/soap/envelope/", "soapenv", "urn:enterprise.soap.sforce.com");

  Header.setPrefix("Soapenv");

  Header.setAttribute("xmlns:urn", "urn:enterprise.soap.sforce.com");

  //.appendChild(Header);

  Element PackageVersionHeader = doc.createElement("PackageVersionHeader");

  Header.appendChild(PackageVersionHeader);

  Element packageVersions = doc.createElement( "packageVersions");

  PackageVersionHeader.appendChild(packageVersions);

  Element majorNumber = doc.createElement( "majorNumber");

  PackageVersionHeader.appendChild(majorNumber);

  majorNumber.setTextContent("0");

  //majorNumber.setPrefix("urn");

  majorNumber.setAttribute("urn", "urn=urn:enterprise.soap.sforce.com");

  Element minorNumber = doc.createElement("minorNumber");

  PackageVersionHeader.appendChild(minorNumber);

  minorNumber.setTextContent("2");

  Element namespace = doc.createElement("namespace");

  PackageVersionHeader.appendChild(namespace);

  namespace.setTextContent("Vijay2");

  //namespace.setPrefix("urn");

  Element MruHeader = doc.createElement("MruHeader");

  Header.appendChild(MruHeader);

  Header.setPrefix("urn");

  Header.setAttribute("urn", "urn=urn:enterprise.soap.sforce.com");

  Element updateMru = doc.createElementNS("urn=urn:enterprise.soap.sforce.com","updateMru");

  MruHeader.appendChild(updateMru);

  updateMru.setPrefix("urn");

  updateMru.setAttribute("urn", "urn=urn:enterprise.soap.sforce.com");

  updateMru.setTextContent("1");

  Element QueryOptions = doc.createElement("QueryOptions");

  Header.appendChild(QueryOptions);

  Header.setPrefix("urn");

  Header.setAttribute("urn", "urn=urn:enterprise.soap.sforce.com");

  Element batchSize = doc.createElement("batchSize");

  QueryOptions.appendChild(batchSize);

  batchSize.setTextContent("1");

  Element SessionHeader = doc.createElement("SessionHeader");

  Header.appendChild(SessionHeader);

  Element sessionId = doc.createElementNS("urn=urn:enterprise.soap.sforce.com", "sessionId");

  SessionHeader.appendChild(sessionId);

  sessionId.setTextContent("Vijay");

  //SoapHeader soapheader = new SoapHeader(new QName(Header.getNamespaceURI(),

  // Header.getLocalName()), Header);

  //soapheader.setActor("actor_test");

  //soapheader.setMustUnderstand(true);

  StringWriter sw = new StringWriter();

  StreamResult result = new StreamResult(sw);

  DOMSource source = new DOMSource(Header);

  TransformerFactory tf =  TransformerFactory.newInstance();

  Transformer transformer = tf.newTransformer();

  transformer.transform(source, result);

  String xmlString = sw.toString();

  System.out.println(xmlString);

  }

}

Output it

<?xml version="1.0" encoding="UTF-8"?>

<urn:soapenv xmlns:urn="urn:enterprise.soap.sforce.com" urn="urn=urn:enterprise.soap.sforce.com">

  <PackageVersionHeader>

  <packageVersions/>

  <majorNumber urn="urn=urn:enterprise.soap.sforce.com">0</majorNumber>

  <minorNumber>2</minorNumber>

  <namespace>Vijay2</namespace>

  </PackageVersionHeader>

  <MruHeader>

  <urn:updateMru xmlns:urn="urn=urn:enterprise.soap.sforce.com" urn="urn=urn:enterprise.soap.sforce.com">1</urn:updateMru>

  </MruHeader>

  <QueryOptions>

  <batchSize>1</batchSize>

  </QueryOptions>

  <SessionHeader>

  <sessionId xmlns="urn=urn:enterprise.soap.sforce.com">Vijay</sessionId>

  </SessionHeader>

</urn:soapenv>

Kindly help me in solving the issue.

engswee
Active Contributor
0 Kudos

I think the usage of the method is incorrect.

It should be like that


Element updateMru = doc.createElementNS("urn:enterprise.soap.sforce.com","urn:updateMru");

The first argument is the namespace, the second is the name of the element with a prefix.

Also try to comment out the setAttribute() calls.

Try this out and see how your output looks like.