下面是我必须解析的xml文件..
<dataroot>
<PARM>
<P1>123</P1>
<P2>abc</P2>
</PARM>
<PARM>
<P1>456</P1>
<P2>def</P2>
</PARM>
<PARM>
<P1>789</P1>
<P2>ghi</P2>
</PARM>
.......(15times)
</dataroot>
我的目标是获取子节点(即p1,p2不是内部的值)并将这些名称与模板进行比较。
如果p2不存在,我必须将该特定标记附加到 xml 文件中的特定位置。问题是当我使用getElementsByTagNames()
并将其存储在数组中然后将其与模板进行比较时,它包含 dataroot 和 PARM 以及我不包含想。
所以我怎样才能得到p1和p2(最多15次)。
答案 0 :(得分:0)
对我来说,最简单的方法是使用JAXB解组和编组,从而添加PARM的缺失元素。如果XML元素名称需要不同的情况,则需要在dataroot
和PARM
的类中添加一些注释,但这需要几行代码来进行解组和编组。
@XmlRootElement(name="dataroot")
@XmlType(propOrder = {"parm"})
public class Data {
@XmlElement(name="PARM")
private List<Parm> parm = new ArrayList<>();
public List<Parm> getParm(){ return parm; }
}
@XmlRootElement(name="PARM")
public class Parm {
private String p1="";
@XmlElement(name="P1")
public String getP1(){ return p1; }
public void setP1( String v ){ p1 = v; }
}
在同一个包中,添加一个包含单行的文件jaxb.index
:
Data
主程序:
JAXBContext jc = JAXBContext.newInstance( PACKAGE ); // dir path
Unmarshaller u = jc.createUnmarshaller();
Data data = (Data)u.unmarshal( new File( XMLIN ) ); // file path
Marshaller m = jc.createMarshaller();
Writer sw = ...; // whatever you need
m.marshal( data, sw );
请注意字段p1
的初始化。这可确保元素显示为空字符串。 null会导致省略元素。