JAXB によって生成された XML があります。以下の XML ファイルを参照してください。
<config>
<instance>
<hostName>192.168.2.98</hostName>
<port>444</port>
</instance>
<instance>
<hostName>192.168.3.2</hostName>
<port>3333</port>
</instance>
<instance>
<hostName>192.168.1.168</hostName>
<port>168</port>
</instance>
</config>
さて、私の計画は、次の手順に従って XML を変更することです。
- 最初の「インスタンス」要素のポート値
- 2 番目の「インスタンス」要素の hostName 値
- 3 番目の「インスタンス」要素のポートとホスト名の値
結果はこのようになるはずです
<config>
<instance>
<hostName>192.168.2.98</hostName>
<port>555</port>
</instance>
<instance>
<hostName>192.168.3.140</hostName>
<port>3333</port>
</instance>
<instance>
<hostName>192.168.1.130</hostName>
<port>8181</port>
</instance>
</config>
JAXBを使用してそれを行う方法は? それを JAXBElement にマーシャリングしてBinderに渡す必要がありますか?
参考までに、HTML フォームを使用してJAX-RSを介して XML ファイルを変更しました。以下のリソース ポスト メソッドは、新しいインスタンスの作成にのみ機能しますが、要素値の変更/更新には機能しません
@POST
@Path("/modhost")
@Consumes({ MediaType.APPLICATION_FORM_URLENCODED,
MediaType.APPLICATION_JSON })
@Produces(MediaType.APPLICATION_JSON)
public void modInstance(@FormParam("host") String hostX,
@FormParam("port") String portX) {
this.host = hostX;
this.port = portX;
try {
String env = System.getenv("APP_HOME");
String tesfile = env+"/tes2.xml";
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
File filex = new File(tesfile);
Document document = db.parse(filex);
JAXBContext jc = JAXBContext.newInstance(Config.class);
Binder<Node> binder = jc.createBinder();
Config config= (Config) binder.unmarshal(document);
Unmarshaller unmarshaller = jc.createUnmarshaller();
List<Instance> instList = new ArrayList<Instance>();
Instance inst = new Instance();
inst.setHostName(host);
inst.setPort(port);
instList.add(inst);
config.getInstance().addAll(instList);
binder.updateXML(config);
TransformerFactory tf = TransformerFactory.newInstance();
StreamResult result = new StreamResult(filex);
Transformer t = tf.newTransformer();
t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "5");
t.setOutputProperty(OutputKeys.INDENT, "yes");
t.transform(new DOMSource(document), result);
} catch (TransformerConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JAXBException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerFactoryConfigurationError e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
ここでは、JAXB クラスのConfigおよびInstance
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "instances"})
@XmlRootElement(name = "config")
public class Config{
@XmlElement(required = true)
protected List<Instance> instance;
public List<Instance> getInstance() {
if (instance == null) {
instance = new ArrayList<Instance>();
}
return this.instance;
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "hostName", "port"})
@XmlRootElement(name = "instance")
public class Instances {
@XmlElement(required = true)
protected String hostName;
@XmlElement(required = true)
protected String port;
public String getHostName() {
return hostName;
}
public void setHostName(String value) {
this.hostName = value;
}
public String getPort() {
return port;
}
public void setPort(String value) {
this.port = value;
}
}