2014-03-06 85 views
0

我有一个xml文档,有多个。我能够得到和帐户的详细信息(,,等我有困难把事情像CARD_TYPE,年,月,first_six等如何从使用JAVA DOM的嵌套XML提取数据?

有此文件中的200笔交易,因此循环。

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

我想我的代码时出现此错误:

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

这里就是我想:

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

} 

回答

2

下面是一些应该指导您使用DOM来解析XML文件的代码。您错过了文档构建器。

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

这会在您的示例中生成以下内容。

===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 
+0

这对我很有帮助,非常感谢! – Grundkurs

0

如果可能,请使用像Jackson这样的API来解析XML。 Here是一个会帮助你的问题。