XML操作の備忘録。
base.xmlとimport.xmlがあって、import.xmlのルートノード以下をbase.xmlに引っ付けたい場合、つまり
[base.xml] <?xml version="1.0" encoding="UTF-8"?> <T_T> <orz>今日も</orz> </T_T> [import.xml] <?xml version="1.0" encoding="UTF-8"?> <T_T> <orz>帰れません</orz> </T_T>
を
<?xml version="1.0" encoding="UTF-8"?> <T_T> <orz>今日も</orz> <orz>帰れません</orz> </T_T>
にしたい場合のコード。XPathを使うとこんな感じです。
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document baseXml = builder.parse(getClass().getResourceAsStream("base.xml")); Document importXml = builder.parse(getClass().getResourceAsStream("import.xml")); XPath xpath = XPathFactory.newInstance().newXPath(); XPathExpression ex = xpath.compile("/*/*"); NodeList importXmlNodeList = (NodeList)ex.evaluate(importXml,XPathConstants.NODESET); Node rootNode = baseXml.getDocumentElement(); for(int i = 0;i < importXmlNodeList.getLength();i++){ Node importNode = baseXml.importNode(importXmlNodeList.item(i),true); rootNode.appendChild(importNode); }
肝はbaseXml.importNodeの戻り値をappendChildするところで、baseXml.importNode()を呼んだだけでインポートできたと満足していたら、ハマりました。
String#substring()でハマるのと同じですかそうですか。