1
2
3
4
5
6
7
8
9
10
11 package org.mule.transformers.xml;
12
13 import org.mule.transformers.AbstractTransformer;
14 import org.mule.umo.transformer.TransformerException;
15
16 import java.util.ArrayList;
17 import java.util.List;
18
19 import org.apache.commons.jxpath.JXPathContext;
20 import org.dom4j.Document;
21 import org.dom4j.DocumentHelper;
22 import org.dom4j.Node;
23 import org.dom4j.XPath;
24
25
26
27
28
29
30
31
32
33 public class JXPathExtractor extends AbstractTransformer
34 {
35
36 private volatile String expression;
37
38 private volatile boolean singleResult = true;
39
40
41
42
43
44
45 public Object doTransform(Object src, String encoding) throws TransformerException
46 {
47 try
48 {
49 Object result;
50 if (src instanceof String)
51 {
52 Document doc = DocumentHelper.parseText((String)src);
53 if (singleResult)
54 {
55 result = doc.valueOf(expression);
56 }
57 else
58 {
59 XPath xpath = doc.createXPath(expression);
60
61
62 List obj = (List)xpath.evaluate(doc);
63 result = new ArrayList(obj.size());
64 for (int i = 0; i < obj.size(); i++)
65 {
66 final Node node = (Node)obj.get(i);
67 ((List)result).add(node.getText());
68 }
69 }
70 }
71 else
72 {
73 JXPathContext context = JXPathContext.newContext(src);
74 result = context.getValue(expression);
75 }
76 return result;
77 }
78 catch (Exception e)
79 {
80 throw new TransformerException(this, e);
81 }
82 }
83
84
85
86
87 public String getExpression()
88 {
89 return expression;
90 }
91
92
93
94
95 public void setExpression(String expression)
96 {
97 this.expression = expression;
98 }
99
100
101
102
103
104
105 public boolean isSingleResult()
106 {
107 return singleResult;
108 }
109
110
111
112
113
114
115
116 public void setSingleResult(boolean singleResult)
117 {
118 this.singleResult = singleResult;
119 }
120 }