如果同一XML节点有多个级别,如何循环遍历JAXB类



这是我实际XML的最漂亮的版本(我没有XSD,也不会从源系统获得它(

<?xml version="1.0" encoding="UTF-8"?>
<Root>
<!--Java Class Comp.java-->
<Comp>
<Name>Component Name</Name>
<Available_Start_Date>2018-07-10</Available_Start_Date>
	<!--Java Class P_to_P.java-->
<P_to_P>
<Max>1</Max>
<Min>1</Min>
	  <!-- Java Class P.java-->
<P>
<Name>Composite</Name>
<P_to_P>
<Max>1</Max>
<Min>1</Min>
<P>
<Name>Another Level</Name>
</P>
</P_to_P>
<P_to_P>
<Max>1</Max>
<Min>1</Min>
<P>
<Name>Yet Another Level</Name>
</P>
</P_to_P>
</P>
</P_to_P>
</Comp>
</Root>

现在,如果我开始为它编写JAXB类(通过手工和使用IDE(,我必须为我所经历的每一个级别编写for循环。现在,该XML中的子级可能显示为子级的父级(P_to_P将P作为子级,P将P_to_P作为子级(,并且父子关系的深度可以是任何级别的。

所以,如果我写一个主JAXB文件,那么我是否必须在for循环中写那么多个for循环才能遍历所有Parents和Child?或者有更好的方法来实现它吗?

您可以编写类似于以下内容的POJO类PP_to_P

@XmlAccessorType(XmlAccessType.FIELD)
public class P_to_P {
@XmlElement(name = "Max")
private int max;
@XmlElement(name = "Min")
private int min;
@XmlElement(name = "P")
private P p;
// public getters and setters (omitted for brevity)
}

@XmlAccessorType(XmlAccessType.FIELD)
public class P {
@XmlElement(name = "Name")
private String name;
@XmlElement(name = "P_to_P")
private List<P_to_P> pToPList;
// public getters and setters (omitted for brevity)
}

然后你可以遍历整棵树,处理下面的每一项
注意递归:方法CCD_ 3调用CCD_,方法CCD_ 5调用CCD_。还要注意对null的检查,以防止NullPointerException并终止递归。

public static void main(String[] args) {
File file = new File("root.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Root.class);
Unmarshaller unmarshaller = jaxbCntext.createUnmarshaller();
Root root = (Root) unmarshaller.unmarshal(file);
P_to_P pToP = root.getComp().getPToP();
process(pToP);
}
private static void process(P_to_P pToP) {
if (pToP == null)
return;
// do anything you like here
process(pToP.getP());
}
private static void process(P p) {
if (p == null)
return;
// do anything you like here
if (p.getpToPList() == null)
return;
for (P_to_P pToP : p.getpToPList()) {
process(pToP);
}
}

最新更新