package org.krakenapps.docxcod.test; import static org.junit.Assert.assertTrue; import static org.krakenapps.docxcod.util.XMLDocHelper.evaluateXPath; import static org.krakenapps.docxcod.util.XMLDocHelper.evaluateXPathExpr; import static org.krakenapps.docxcod.util.XMLDocHelper.newDocumentBuilder; import static org.krakenapps.docxcod.util.XMLDocHelper.newXPath; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathExpressionException; import org.custommonkey.xmlunit.Diff; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.krakenapps.docxcod.util.XMLDocHelper.NodeListWrapper; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; public class XMLTest { private TearDownHelper tearDownHelper = new TearDownHelper(); @Before public void setUp() throws Exception { } @After public void tearDown() throws Exception { tearDownHelper.tearDown(); } @Test public void xmlTest() throws Exception { String sourcePath = "/sampledoc/_rels/.rels"; InputStream f = getClass().getResourceAsStream(sourcePath); assertTrue(f != null); Document doc = newDocumentBuilder().parse(f); assertTrue(doc != null); XPath xpath = newXPath(doc); XPathExpression expr = xpath.compile("//DEF:Relationship"); NodeList nodeList = evaluateXPathExpr(expr, doc); // System.out.println(nodeList.getLength()); for (@SuppressWarnings("unused") Node node : new NodeListWrapper(nodeList)) { // System.out.println(node.getNodeName()); // NodeList attrs = evaluateXPathExpr(attrsExpr, node); // for (Node attr: new NodeListWrapper(attrs)) { // System.out.println("\t" + attr); // } } Transformer transformer = TransformerFactory.newInstance().newTransformer(); // transformer.setOutputProperty(OutputKeys.INDENT, "yes"); // transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); transformer.transform(new DOMSource(doc), new StreamResult("test.xml")); tearDownHelper.add(new File("test.xml")); { InputStream s1 = getClass().getResourceAsStream(sourcePath); InputStream s2 = new FileInputStream("test.xml"); assertTrue(new Diff(new InputSource(s1), new InputSource(s2)).similar()); s1.close(); s2.close(); } } @Test public void xmlTest2() throws Exception { InputStream f = getClass().getResourceAsStream("/sampledoc/word/document.xml"); assertTrue(f != null); { Document doc = newDocumentBuilder().parse(f); assertTrue(doc != null); XPath xpath = newXPath(doc); NodeList nodeList = evaluateXPath(xpath, "/w:document[1]/w:body[1]/w:p[2]/w:r[1]/w:t[1]", doc); for (Node node : new NodeListWrapper(nodeList)) { Node targetPara = node.getParentNode().getParentNode(); Node parentOfPara = targetPara.getParentNode(); parentOfPara.insertBefore(getMagicNode(doc), targetPara); parentOfPara.insertBefore(getMagicNode(doc), targetPara.getNextSibling()); } Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, "yes"); transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); transformer.transform(new DOMSource(doc), new StreamResult("test2.xml")); tearDownHelper.add(new File("test2.xml")); } { Document genDoc = newDocumentBuilder().parse(new File("test2.xml")); XPath xpath = newXPath(genDoc); checkNodeName(genDoc, xpath, "/w:document[1]/w:body[1]/*[2]", "KMagicNode"); checkNodeName(genDoc, xpath, "/w:document[1]/w:body[1]/*[3]", "w:p"); checkNodeName(genDoc, xpath, "/w:document[1]/w:body[1]/*[4]", "KMagicNode"); } } public void xmlTest3() throws Exception { InputStream f = null; try { f = getClass().getResourceAsStream("/nestedList/word/document.xml"); Document doc = newDocumentBuilder().parse(f); assertTrue(doc != null); XPath xpath = newXPath(doc); { NodeList nodeList = evaluateXPath(xpath, "//w:fldSimple/@w:instr", doc); System.out.printf("fldSimple cnt: %d\n", nodeList.getLength()); for (Node n : new NodeListWrapper(nodeList)) { System.out.println(n.getNodeValue()); } } { NodeList nodeList = evaluateXPath(xpath, "//w:instrText", doc); System.out.printf("instrText cnt: %d\n", nodeList.getLength()); for (Node n : new NodeListWrapper(nodeList)) { System.out.println(n.getTextContent()); } } Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, "yes"); transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); } catch (Exception e) { e.printStackTrace(); } finally { safeClose(f); } } private void safeClose(InputStream f) { if (f == null) return; try { f.close(); } catch (IOException e) { e.printStackTrace(); } } private void checkNodeName(Document genDoc, XPath xpath, String expr, String nodeName) throws XPathExpressionException { NodeList nodeList = evaluateXPath(xpath, expr, genDoc); assertTrue(nodeList.getLength() > 0); assertTrue(nodeList.item(0).getNodeName().equals(nodeName)); } private Node getMagicNode(Document doc) { Element magicNode = doc.createElement("KMagicNode"); magicNode.appendChild(doc.createCDATASection("some template engine syntax")); return magicNode; } }