添加元素时 Java XML DOM 错误

标签 java xml dom hierarchy

我正在尝试复制此 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>

我使用一个类来构建请求:

  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) 中。这是确切的行:

doc.appendChild(addressValidation);

将此元素添加到文档中会出现什么问题?

最佳答案

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

您正尝试将其添加到文档的顶层。您不能这样做,因为文档已经有一个根元素。任何 XML 文档只能有一个根元素。

您在问题顶部显示的 XML 不是单个 XML 文档 - 它是两个。

关于添加元素时 Java XML DOM 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13554509/

相关文章:

基于属性值的XML验证(不同的子标签)

java - javax StreamSource 的目的是什么

javascript - Gmail Chrome 扩展和 document.readyState

javascript - 最快的 DOM 插入

java - ORMLite - 更新没有空值

java.lang.IllegalStateException : Expected BEGIN_OBJECT but was STRING at line 1 column 62 错误

java - Java 接口(interface)中的可选方法

java - 如何在不使用控制流异常的情况下根据模式验证 XML?

javascript - 将其视为未定义

java - 创建对象元素时,为对象数组标识符添加什么?