0

I am trying to replicate this XML:

<?xml version="1.0"?>
<AccessRequest xml:lang="en-US">
  <AccessLicenseNumber>YourLicenseNumber</AccessLicenseNumber>
  <UserId>YourUserID</UserId>
  <Password>YourPassword</Password>
</AccessRequest>
<?xml version="1.0"?>
<AddressValidationRequest xml:lang="en-US">
  <Request>
    <TransactionReference>
      <CustomerContext>Your Test Case Summary Description</CustomerContext>
      <XpciVersion>1.0</XpciVersion>
    </TransactionReference>
    <RequestAction>XAV</RequestAction>
    <RequestOption>3</RequestOption>
  </Request>

  <AddressKeyFormat>
    <AddressLine>AIRWAY ROAD SUITE 7</AddressLine>  
    <PoliticalDivision2>SAN DIEGO</PoliticalDivision2>
    <PoliticalDivision1>CA</PoliticalDivision1>
    <PostcodePrimaryLow>92154</PostcodePrimaryLow>
    <CountryCode>US</CountryCode>
  </AddressKeyFormat>
</AddressValidationRequest>

I am using one class to build the request:

  public UpsRequestBuilder()
    {
        try
        {
            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

            doc = docBuilder.newDocument();
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
    }

    public void accessRequestBuilder(String accessKey, String username, String password)
    {
        Element accessRequest = doc.createElement("AccessRequest");
        doc.appendChild(accessRequest);

        Element license = doc.createElement("AccessLicenseNumber");
        accessRequest.appendChild(license);
        license.setTextContent(accessKey);

        Element userId = doc.createElement("UserId");
        accessRequest.appendChild(userId);
        userId.setTextContent(username);

        Element pass = doc.createElement("Password");
        accessRequest.appendChild(pass);
        pass.setTextContent(password);

        System.out.println("completed Requestbuilder");
    }

    public void addAddress(Address address)
    {
        Element addressKeyFormat = doc.createElement("AddressKeyFormat");
        doc.appendChild(addressKeyFormat);

        Element addressLine = doc.createElement("AddressLine");
        addressKeyFormat.appendChild(addressLine);
        addressLine.setTextContent(address.getState() + ' ' + address.getStreet2());

        Element city = doc.createElement("PoliticalDivision2");
        addressKeyFormat.appendChild(city);
        city.setTextContent(address.getCity());

        Element state = doc.createElement("PoliticalDivision1");
        addressKeyFormat.appendChild(state);
        state.setTextContent(address.getState());

        Element zip = doc.createElement("PostcodePrimaryLow");
        addressKeyFormat.appendChild(zip);
        zip.setTextContent(address.getZip());

        Element country = doc.createElement("CountryCode");
        addressKeyFormat.appendChild(country);
        country.setTextContent(address.getCountry()); 
        System.out.println("completed addAddress");
    }

    public void validateAddressRequest(String customerContextString, String action)
    {

        Element addressValidation = doc.createElement("AddressValidationRequest");
        doc.appendChild(addressValidation);
        Element transactionReference = doc.createElement("TransactionReference");
        addressValidation.appendChild(transactionReference);

        Element customerContext = doc.createElement("CustomerContext");
        Element version = doc.createElement("XpciVersion");
        transactionReference.appendChild(customerContext);
        customerContext.setTextContent(customerContextString); //TODO figure out a way to optionally pass context text
        transactionReference.appendChild(version);
        version.setTextContent("1.0");//change this if the api version changes

        Element requestAction = doc.createElement("RequestAction");
        addressValidation.appendChild(requestAction);
        requestAction.setTextContent(action);
        System.out.println("completed validateAddressRequest");
    }

And this is the function that uses it:

public void validateAddress(Address address)
    {
        UpsRequestBuilder request = new UpsRequestBuilder();
        request.accessRequestBuilder(accessKey, username, password);
        request.validateAddressRequest("", "3");
        request.addAddress(address);

        System.out.println(request.toString());

    }

When I try and print out the XML from this, I get the error "HIERARCHY_REQUEST_ERR: An attempt was made to insert a node where it is not permitted." It happens in the validateAddressRequest function when I try and add the addressValidation element to the document (doc). Here is the exact line:

doc.appendChild(addressValidation);

what is the problem with adding this element to the document?

1
  • Your sample XML is two documents. You can't create that as a single document... Commented Nov 25, 2012 at 19:19

1 Answer 1

1

what is the problem with adding this element to the document?

You're trying to add it at the top level of the document. You can't do that, as the document already has a root element. Any XML document can only have a single root element.

The XML you've shown at the top of your question isn't a single XML document - it's two.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.