如何使用java在xml中的特定标签内获取子节点?

时间:2017-11-30 09:08:40

标签: java xml dom

下面是我必须解析的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次)。

1 个答案:

答案 0 :(得分:0)

对我来说,最简单的方法是使用JAXB解组和编组,从而添加PARM的缺失元素。如果XML元素名称需要不同的情况,则需要在datarootPARM的类中添加一些注释,但这需要几行代码来进行解组和编组。

@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会导致省略元素。