<?xml version="1.0" encoding="UTF-8"?>
<workflowFields>
<field name="AB_TradeFlowCode" dataType="String" isArray="" status="" statusDesc="" compareStatus="0">
<value>F51015</value>
</field>
<field name="caseId" dataType="String" isArray="" status="" statusDesc="" compareStatus="0">
<value>2009021015</value>
</field>
</workflowFields>
我现在有这样一个xml形式的字符串,要对它进行解析,取node里的name和value节点中的值做为返回值返回到一个map中去,我该怎样才能取到 node中name属性的值呢?
一个节点一个值格式的XML解析生成办法
/**
* @name ParseXml2DtoByDom4j
* @title 解析XML并将其节点元素压入DTO
* @param String[XML字符串]
* @param boolean[根元素标志]
* @return DTO
* @description
* @author
*/
public static final OutputDTO ParseXml2DtoByDom4j(String strXml, boolean hasRoot){
OutputDTO outDto = new BaseOutputDTO();
String strTitle = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
Document document = null;
try {
document = hasRoot ? DocumentHelper.parseText(strTitle + strXml)
: DocumentHelper.parseText(strTitle + "<root>" + strXml + "</root>");
} catch (DocumentException e) {
final String MSG = errorMsg + strXml ;
log.error(MSG, e);
}
Element root = document.getRootElement();
for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
Element leaf = (Element) i.next();
outDto.put(leaf.getName().toLowerCase(), leaf.getData());
}
return outDto;
}
/**
* @name ParseDto2XmlByDom4j
* @title 将DTO中的Key-Value键值映射为标准的XML Document
* @param DTO
* @param boolean 是否带头信息
* @return String
* @description 说明:YHCIP已经提供了Dto.toXml()方法,但只能是简单转换.如果需要高级功能,则需在此方法上借助Dom4J扩展即可
* @author
*/
public static final String ParseDto2XmlByDom4j(DTO dto, boolean hasHead){
Document document = DocumentHelper.createDocument();
document.addElement("root");
Element root = document.getRootElement();
Iterator keyIterator = dto.keySet().iterator();
while(keyIterator.hasNext()){
String key = (String)keyIterator.next();
String value = dto.getAsString(key);
Element leaf = root.addElement(key);
leaf.setText(value);
}
String outXmlWithHead = document.asXML();
String outXmlWithoutHead = outXmlWithHead.substring(38);
return hasHead ? outXmlWithHead : outXmlWithoutHead;
}3. 节点属性格式的XML解析和生成办法
/**
* @name ParseXml2DtoByDom4j
* @title 解析XML并将其节点元素压入DTO
* @param String[XML字符串]
* @param xPath[节点路径]例如:"//paralist/row" 则表示根节点paralist下的row节点的xPath路径
* @return OutputDTO
* @description 此方法支持将一个XML节点任意多个属性以<K,V>存储结构动态的压入DTO中
*/
public static final DTO ParseXml2DtoByDom4j(String pStrXml, String pXPath){
DTO outDto = new BaseDTO();
String strTitle = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
Document document = null;
try {
document = DocumentHelper.parseText(strTitle + pStrXml);
} catch (DocumentException e) {
log.error("将XML格式的字符串转换为XML DOM对象时发生错误.\n");
e.printStackTrace();
}
Element root = document.getRootElement();
root.attributeIterator();
Element elNode = (Element)document.selectSingleNode(pXPath);
for ( Iterator it = elNode.attributeIterator(); it.hasNext(); ) {
Attribute attribute = (Attribute) it.next();
outDto.put(attribute.getName(), attribute.getData());
}
return outDto;
}
/**
* @name ParseList2XmlByDom4j
* @title 将List转换为XML格式数据
* @param pList 传入的List数据
* @param pRootNodeName 根节点名称
* @param pPropNameValue 根节点name属性值
* @return String
* @description List里的对象类型为Map型
*/
public static final String ParseList2XmlByDom4j(List pList, String pRootNodeName, String pPropNameValue){
Document document = DocumentHelper.createDocument();
Element elRoot = document.addElement(pRootNodeName);
elRoot.addAttribute("name", pPropNameValue);
for(int i = 0; i < pList.size(); i++){
Map map = (Map)pList.get(i);
Element elRow = elRoot.addElement("row");
Iterator it = map.entrySet().iterator();
while(it.hasNext()){
Map.Entry entry = (Map.Entry)it.next();
elRow.addAttribute((String)entry.getKey(), String.valueOf(entry.getValue()));
}
}
String outXml = document.asXML();
return outXml.substring(39, outXml.length());
}