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.
我有一个具有多个的xml文档。我能得到和账户的详细信息(,等等。我很难得到像card_type, year, month, first_six等的东西。
There are 200 transactions within this document, hence the loop.
在这个文档中有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>test@gmail.com</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();
}
}
2 个解决方案
#1
4
Here is some code that should guide you on using DOM to parse XML files. You were missing the Document builders.
下面是一些可以指导您使用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());
}
}
}
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
#2
0
Use an API like Jackson to parse your XML if possible. Here is a question which will help you.
如果可能的话,使用象Jackson这样的API来解析XML。这是一个对你有帮助的问题。
#1
4
Here is some code that should guide you on using DOM to parse XML files. You were missing the Document builders.
下面是一些可以指导您使用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());
}
}
}
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
#2
0
Use an API like Jackson to parse your XML if possible. Here is a question which will help you.
如果可能的话,使用象Jackson这样的API来解析XML。这是一个对你有帮助的问题。