package hudson.plugins.tfs.util; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; 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.XPathConstants; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class XmlHelper { private static final XPathFactory XPF = XPathFactory.newInstance(); private static final DocumentBuilderFactory DBF = DocumentBuilderFactory.newInstance(); private static final TransformerFactory TF = TransformerFactory.newInstance(); public static String peekValue(final Document doc, final String xpathExpression) throws XPathExpressionException { final XPath xPath = XPF.newXPath(); final XPathExpression expression = xPath.compile(xpathExpression); final Node node = (Node) expression.evaluate(doc, XPathConstants.NODE); final String result = (node != null) ? node.getTextContent() : null; return result; } public static String peekValue(final File file, final String xpathExpression) throws ParserConfigurationException, IOException, SAXException, XPathExpressionException { final DocumentBuilder db = DBF.newDocumentBuilder(); final FileInputStream fis = new FileInputStream(file); final Document doc; try { doc = db.parse(fis); } finally { fis.close(); } final String result = peekValue(doc, xpathExpression); return result; } public static void pokeValue(final Document doc, final String xpathExpression, final String value) throws XPathExpressionException { final XPath xPath = XPF.newXPath(); final XPathExpression expression = xPath.compile(xpathExpression); final Node node = (Node) expression.evaluate(doc, XPathConstants.NODE); // or setValue()? node.setTextContent(value); } public static void pokeValue(final File file, final String xpathExpression, final String value) throws XPathExpressionException, ParserConfigurationException, SAXException, IOException, TransformerException { // TODO: it might be better performance to do a SAX read/write final DocumentBuilder db = DBF.newDocumentBuilder(); final FileInputStream fis = new FileInputStream(file); final Document doc; try { doc = db.parse(fis); } finally { fis.close(); } pokeValue(doc, xpathExpression, value); final Transformer t = TF.newTransformer(); final DOMSource source = new DOMSource(doc); final FileOutputStream fos = new FileOutputStream(file); try { final StreamResult result = new StreamResult(fos); t.transform(source, result); } finally { fos.close(); } } }