0

この 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>

リクエストを作成するために 1 つのクラスを使用しています。

  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");
    }

そして、これはそれを使用する関数です:

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());

    }

これから XML を出力しようとすると、「HIERARCHY_REQUEST_ERR: 許可されていないノードを挿入しようとしました」というエラーが表示されます。addressValidation 要素をドキュメント (doc) に追加しようとすると、validateAddressRequest 関数で発生します。正確な行は次のとおりです。

doc.appendChild(addressValidation);

この要素をドキュメントに追加する際の問題は何ですか?

4

1 に答える 1

1

この要素をドキュメントに追加することの問題は何ですか?

ドキュメントのトップレベルに追加しようとしています。ドキュメントにはすでにルート要素が含まれているため、これを行うことはできません。すべてのXMLドキュメントは、単一のルート要素のみを持つことができます。

質問の上部に表示されているXMLは、単一のXMLドキュメントではなく、2つです。

于 2012-11-25T19:20:23.727 に答える