[英]how to parse xml using sax by checking both parent and child tags at a time?
[英]How to parse XML in Java with identical parent and child tags?
考慮以下xml:
<?xml version="1.0"?>
<company>
<staff id="1001">
<firstname>yong</firstname>
<lastname>mook kim</lastname>
<nickname>mkyong</nickname>
<salary>100000</salary>
</staff>
<staff id="2001">
<firstname>low</firstname>
<lastname>yin fong</lastname>
<nickname>fong fong</nickname>
<salary>200000</salary>
</staff>
</company>
我需要檢索XML標記值。當沒有相同名稱的父節點和子節點時,以下代碼可以完美地工作。
File fXmlFile = new File("xmls.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
NodeList nList = doc.getElementsByTagName("staff");
System.out.println("----------------------------");
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
System.out.println("\nCurrent Element :" + nNode.getNodeName());
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
System.out.println("Staff id : "
+ eElement.getAttribute("id"));
System.out.println("First Name : "
+ eElement.getElementsByTagName("firstname")
.item(0).getTextContent());
System.out.println("Last Name : "
+ eElement.getElementsByTagName("lastname")
.item(0).getTextContent());
System.out.println("Nick Name : "
+ eElement.getElementsByTagName("nickname")
.item(0).getTextContent());
System.out.println("Salary : "
+ eElement.getElementsByTagName("salary")
.item(0).getTextContent()); }}
如下所示,當xml中有相同的父節點和子節點時,我需要在代碼中提供多少機會。
<?xml version="1.0"?>
<company>
<staff id="1001">
<firstname>yong</firstname>
<lastname>mook kim</lastname>
<nickname>mkyong</nickname>
<salary>100000</salary>
<staff>10</staff>
</staff>
<staff id="2001">
<firstname>low</firstname>
<lastname>yin fong</lastname>
<nickname>fong fong</nickname>
<salary>200000</salary>
</staff>
</company>
如果您只關心這些值,則創建Java POJO以使用Jackson解析XML。 讓框架完成所有繁重的工作。
public class Company
{
private Staff[] staff;
public Staff[] getStaff ()
{
return staff;
}
public void setStaff (Staff[] staff)
{
this.staff = staff;
}
@Override
public String toString()
{
return "ClassPojo [staff = "+staff+"]";
}
}
public class Staff
{
private String id;
private String nickname;
private String lastname;
private String firstname;
private String salary;
public String getId ()
{
return id;
}
public void setId (String id)
{
this.id = id;
}
public String getNickname ()
{
return nickname;
}
public void setNickname (String nickname)
{
this.nickname = nickname;
}
public String getLastname ()
{
return lastname;
}
public void setLastname (String lastname)
{
this.lastname = lastname;
}
public String getFirstname ()
{
return firstname;
}
public void setFirstname (String firstname)
{
this.firstname = firstname;
}
public String getSalary ()
{
return salary;
}
public void setSalary (String salary)
{
this.salary = salary;
}
@Override
public String toString()
{
return "ClassPojo [id = "+id+", nickname = "+nickname+", lastname = "+lastname+", firstname = "+firstname+", salary = "+salary+"]";
}
}
然后,您可以使用以下命令填充Company
POJO:
Company company = objectMapper.readValue(jsonFileAbove, Company.class);
您可能要使用XPath :
XPath xpath = XPathFactory.newInstance().newXPath();
NodeList staffElements = (NodeList)
xpath.evaluate("/company/staff", doc, XPathConstants.NOESET);
int count = staffElements.getLength();
for (int i = 0; i < count; i++) {
Element staffElement = (Element) staffElements.item(i);
System.out.println("Salary : "
+ staffElement.getElementsByTagName("salary")
.item(0).getTextContent());
NodeList staffChildren = + staffElement.getElementsByTagName("staff");
if (staffChildren.getLength() > 0) {
System.out.println("Staff count : "
+ staffChildren.item(0).getTextContent());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.