代码:
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;
import com.ibm.broker.javacompute.MbJavaComputeNode;
import com.ibm.broker.plugin.MbElement;
import com.ibm.broker.plugin.MbException;
import com.ibm.broker.plugin.MbMessage;
import com.ibm.broker.plugin.MbMessageAssembly;
import com.ibm.broker.plugin.MbOutputTerminal;
public class subflow_JavaCompute extends MbJavaComputeNode {
public void evaluate(MbMessageAssembly inAssembly) throws MbException {
MbOutputTerminal out = getOutputTerminal("out");
MbOutputTerminal alt = getOutputTerminal("alternate");
MbMessage inMessage = inAssembly.getMessage();
MbMessage outMessage = new MbMessage(inMessage);
MbMessageAssembly outAssembly=new MbMessageAssembly(inAssembly,outMessage);
MbElement document=outMessage.getRootElement();
MbElement root=document.getLastChild().getFirstChild();
try{
Set<String> selfDefNSSet=new HashSet<String>();// 用来存储自定义的名称空间名
traverseAndRemoveNils(root,selfDefNSSet);// 遍历节点删除特定属性
if(selfDefNSSet.size()>0){
traverseAndRemoveSelfDefNSNode(root,selfDefNSSet);// 遍历节点删除自定义名称空间节点
}
}
catch(Exception ex){
ex.printStackTrace();
}
out.propagate(outAssembly);
}
private void traverseAndRemoveNils(MbElement elm,Set<String> selfDefNSSet) throws Exception{
// get all the attributes of current element
List <MbElement> attrSet = (List <MbElement>)elm.evaluateXPath("@*");
for(MbElement attr:attrSet){
String name=attr.getName().toString();
String value=attr.getValue().toString();
if(isNillAttr(name,value)){
attr.detach();
}
if(isSelfDefNS(name,value)){
String[] arr=name.split(":");
selfDefNSSet.add(arr[1]);
attr.detach();
}
}
// get all sub elements of current element
List <MbElement> nodeset = (List <MbElement>)elm.evaluateXPath("*");
for(MbElement childElm:nodeset){
// recursion
traverseAndRemoveNils(childElm,selfDefNSSet);
}
}
// 判断是否特定属性,a:nil,b:nil都算
private boolean isNillAttr(String name,String value){
String patternStr="(\\w+)(:nil)";
boolean result1 = Pattern.matches(patternStr, name);
boolean result2="true".equals(value);
return result1&&result2;
}
// 判断是否自定义名称空间
private boolean isSelfDefNS(String name,String value){
String patternStr="(xmlns:)(\\w+)";
boolean result = Pattern.matches(patternStr, name);
return result;
}
private void traverseAndRemoveSelfDefNSNode(MbElement elm,Set<String> selfDefNSSet) throws Exception{
String name=elm.getName().toString();
if(isSelfDefNSNode(name,selfDefNSSet)){
elm.detach();
}
// get all sub elements of current element
List <MbElement> nodeset = (List <MbElement>)elm.evaluateXPath("*");
for(MbElement childElm:nodeset){
// recursion
traverseAndRemoveSelfDefNSNode(childElm,selfDefNSSet);
}
}
// 判读节点是否自定义名称空间的限定名
private boolean isSelfDefNSNode(String name,Set<String> selfDefNSSet){
String[] arr=name.split(":");
if(arr.length==2){
String ns=arr[0];
return selfDefNSSet.contains(ns);
}else{
return false;
}
}
}
输入:
<contactInfo xmlns:ns1="http://tbccorp.com/Services/CustomerMgt/v1/"><homePhoneNumber as:b="c"><key xsi:nil="true"/><value></value></homePhoneNumber><workPhoneNumber><ns1:a>1644</ns1:a><key xsi:nil="true"/><value ns1:nil="true">5</value></workPhoneNumber><ns1:b>1949</ns1:b><mobilePhoneNumber xmlns:ns1="http://tbccorp.com/Services/CustomerMgt/v1/"><key xsi:nil="true"/><value>3159867097</value></mobilePhoneNumber></contactInfo>
输出:
<contactInfo><homePhoneNumber as:b="c"><key/><value/></homePhoneNumber><workPhoneNumber><key/><value>5</value></workPhoneNumber><mobilePhoneNumber><key/><value>3159867097</value></mobilePhoneNumber></contactInfo>