1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | package xml.dom; import java.io.InputStream; import java.io.OutputStream; import javax.xml.namespace.NamespaceContext; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; 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.XPathFactory; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class DOMFilterFeed implements main.IFilterFeed{ public OutputStream filter(InputStream is, String xpathExpr){ OutputStream os = System.out; try { // Create Dom Node Object from input Stream Node node = this.getDocument(is); // Create XPath Object using same namespace context XPath xpathIns = this.createXPath(); // XPath expression String expression = "atom:feed/atom:entry[not(" + xpathExpr + ")]"; // Perform the XPath evaluation NodeList nodelist = (NodeList) xpathIns.evaluate(expression, node ,XPathConstants.NODESET); for (int i = 0; i <nodelist.getLength(); i++) { Node filteredNode = nodelist.item(i); filteredNode.getParentNode().removeChild(filteredNode); } //serialize XML dom Node into outputStream this.serialize(os, node); } catch (Exception e) { e.printStackTrace(); } return os; } private Node getDocument(InputStream is) throws Exception{ Node node = null; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); dbf.setValidating(false); DocumentBuilder documentBuilder = dbf.newDocumentBuilder(); node = documentBuilder.parse(is); return node; } private XPath createXPath(){ XPathFactory factory = XPathFactory.newInstance(); XPath xpath = factory.newXPath(); NamespaceContext nsctx = new SampleNamespaceContext(); if (nsctx == null) { nsctx = new SampleNamespaceContext(); } xpath.setNamespaceContext(nsctx); return xpath; } private void serialize (OutputStream outputStream, Node node) { try { final TransformerFactory TRANSFORMER_FACTORY = TransformerFactory.newInstance(); Transformer transformer = TRANSFORMER_FACTORY.newTransformer(); DOMSource source = new DOMSource(node); StreamResult sResult = new StreamResult(outputStream); transformer.transform(source, sResult); } catch (TransformerException te) { throw new RuntimeException(te); } } } |
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |