3

I have an xml document that has multiple . I am able to get the and account details (,, etc. I am having difficulty getting things like card_type, year, month, first_six, etc.

There are 200 transactions within this document, hence the loop.

  <transaction href="https://test.com" type="cc">
    <source>subscription</source>
    <created_at type="datetime">2014-03-06T20:59:03Z</created_at>
    <details>
      <account>
        <account_code>234234234</account_code>
        <first_name>asdadad</first_name>
        <last_name>asdadasd3433</last_name>
        <company nil="nil"></company>
        <email>[email protected]</email>
        <billing_info type="credit_card">
          <first_name>asdasdasd</first_name>
          <last_name>asdasdasd23434</last_name>
          <address1 nil="nil"></address1>
          <address2 nil="nil"></address2>
          <city nil="nil"></city>
          <state nil="nil"></state>
          <zip nil="nil"></zip>
          <country nil="nil"></country>
          <phone nil="nil"></phone>
          <vat_number nil="nil"></vat_number>
          <card_type>Visa</card_type>
          <year type="integer">2039</year>
          <month type="integer">6</month>
          <first_six>111111</first_six>
          <last_four>9999</last_four>
        </billing_info>
      </account>
    </details>
    <a name="refund" href="https://test.com/refund" method="delete"/>
  </transaction>

I get this error when trying my code:

java.lang.NullPointerException
        at test.test.getTransactions(test.java:288)
        at test.test.main(test.java:53)

Here's what I'm trying:

try {
  NodeList nList2 = eElement.getElementsByTagName("details");
  Node nNode2 = nList2.item(0);
  Element eElement2 = (Element) nNode2;

  //get some other info in try catch blocks here (removed for reading)

  try {
    System.out.println("attempting billing info");
    NodeList nList3 = eElement2.getElementsByTagName("billing_info");
    Node nNode3 = nList3.item(0);
    Element eElement3 = (Element) nNode3;    
    System.out.println("attempting credit_year");
    System.out.println("credit_year: " + eElement3.getElementsByTagName("credit_year").item(0).getTextContent());
  } catch (Exception ex) {
    ex.printStackTrace();
  }

}

4 Answers 4

15

Here is some code that should guide you on using DOM to parse XML files. You were missing the Document builders.

    //Build the document from the xmlString
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    Document doc = dBuilder.parse(new InputSource(new StringReader(xmlString)));

    //Get all the transaction elements and then loop over them
    NodeList transaction = doc.getElementsByTagName("transaction");
    for(int j = 0; j < transaction.getLength(); j++) {
        //Traverse down the transaction node till we get the billing info
        NodeList details = ((Element)transaction.item(j)).getElementsByTagName("details");
        NodeList account = ((Element)details.item(0)).getElementsByTagName("account");
        NodeList billinginfo = ((Element)account.item(0)).getElementsByTagName("billing_info");

        System.out.println("===Billing Info===");
        System.out.println("Type: "+((Element)billinginfo.item(0)).getAttribute("type"));

        //Get all children nodes from billing info
        NodeList billingChildren = billinginfo.item(0).getChildNodes();

        for(int i = 0; i < billingChildren.getLength(); i++) {
            Node current = billingChildren.item(i);
            //Only want stuff from ELEMENT nodes
            if(current.getNodeType() == Node.ELEMENT_NODE) {
                System.out.println(current.getNodeName()+": "+current.getTextContent());
            }
        }
    }

This produces the following from your example.

===Billing Info===
Type: credit_card
first_name: asdasdasd
last_name: asdasdasd23434
address1:
address2:
city:
state:
zip:
country:
phone:
vat_number:
card_type: Visa
year: 2039
month: 6
first_six: 111111
last_four: 9999
Sign up to request clarification or add additional context in comments.

Comments

1

You can use Declarative Stream Mapping (DSM) stream parsing library to easily parse complex XML.

You just define the mapping for data you want to extract from XML

Here are mapping definitions for your XML.

DSM ignore namespaces.

result:     
   type: array
   path: /transactions/transaction       
   fields:
       source:          
       account:
          type: array
          path: details/account
          fields:       
             accountCode: 
               path: account_code                 
             firstName: 
               path: first_name                 
             lastName: 
               path: last_name                 
             first_six: 
               path: billing_info/first_six
               dataType: int                 
             last_four: 
               path: billing_info/last_four
               dataType: int                 
             card_type: 
               path: billing_info/card_type

Java Code to parse XML:

DSM dsm=new DSMBuilder(new File("path/to/mapping.yaml")).setType(DSMBuilder.TYPE.XML).create();
Object result=  dsm.toObject(xmlFileContent);
// json represntation fo result
dsm.getObjectMapper().writerWithDefaultPrettyPrinter().writeValue(System.out, object);

Here is output:

[ {
  "source" : "subscription",
  "account" : [ {
    "accountCode" : "234234234",
    "firstName" : "asdadad",
    "lastName" : "asdadasd3433",
    "card_type" : "Visa",
    "first_six" : 111111,
    "last_four" : 9999
  } ]
} ]

If you want to directly deserialize to a POJO class it is possible with DSM

Comments

0

Use an API like Jackson to parse your XML if possible. Here is a question which will help you.

Comments

0

You are doing eElement3.getElementsByTagName("credit_year") but you don't have credit_year in your xml. it is only 'year' not 'credit_year' in the xml. So try doing eElement3.getElementsByTagName("year").

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.