这段时间写了一个关于xml报文的工具类,做一下具体的讲解:

xml文本

<NTMMessage version="1.03">
<NTMHeader><MessageID>1711030000054</MessageID><MessageSource><SystemID>MNLN</SystemID><Location>CITIC</Location><UserID>dlm3</UserID></MessageSource><Timezone>GMT</Timezone><DateFormat format="ISO8601"/><GeneratedTime>2017-11-03T08:02:54</GeneratedTime><PublishResponse value="JustLogs"></PublishResponse><TransactMessage value="NoTransact"></TransactMessage>
</NTMHeader>
<NTMTrade><TradeHeader><SysTradeID><SystemID>MNLN</SystemID><Location>CITIC</Location><TradeID>GFWD1700000943</TradeID></SysTradeID><TradeDate>2017-11-03T08:02:54</TradeDate><OriginEntity><Entity role="Owner"><Organization>SHZH00</Organization><Trader>WHWH</Trader></Entity></OriginEntity><OtherEntity><Entity role="Counterparty"><Organization>SHZH00</Organization></Entity></OtherEntity><InterestedParties><Entity role="Broker"><Organization></Organization></Entity><Entity role="Custodian"><Organization></Organization></Entity></InterestedParties><TradeDescription>201711030000172</TradeDescription><TradeRole value="Actual"/><TradeMessageRole value="New"/><Notes>PANORAMA INTERFACE</Notes><ProcessHistory><ProcessAction><ProcessName>EraYTInterface</ProcessName><ProcessedOK value="Yes"/><Notes>EraYTInterface</Notes></ProcessAction></ProcessHistory></TradeHeader><TradeTags><TradingArea>TXAU</TradingArea><AccountingArea>AA1</AccountingArea><AccountingGroup>DD</AccountingGroup><TicketID></TicketID><Extensions><Extension><ExtName>AccType</ExtName><ExtValue datatype="String"></ExtValue></Extension><Extension><ExtName>ContractCode</ExtName><ExtValue datatype="String">AUY-CNY/FX</ExtValue></Extension><Extension><ExtName>UserTradeDate</ExtName><ExtValue datatype="Datetime">2017-11-03T08:02:54</ExtValue></Extension><Extension><ExtName>TradeOwner</ExtName><ExtValue datatype="String"></ExtValue></Extension></Extensions></TradeTags><FX><FXRate><NumeratorCCY><CCY>AUY</CCY></NumeratorCCY><DenominatorCCY><CCY>CNY</CCY></DenominatorCCY><Rate>273.69</Rate></FXRate><BuyCFL><Cashflow CFLType="Principal"><CashflowID>1</CashflowID><CashflowPayment><PayDate>2018-02-07</PayDate><Amount>-90.0</Amount><CCY>AUY</CCY></CashflowPayment></Cashflow></BuyCFL><SellCFL><Cashflow CFLType="Principal"><CashflowID>2</CashflowID><CashflowPayment><PayDate>2018-02-07</PayDate><Amount>24632.1</Amount><CCY>CNY</CCY></CashflowPayment></Cashflow></SellCFL></FX><Extensions><Extension><ExtName>PseudoProduct</ExtName><ExtValue datatype="String"></ExtValue></Extension><Extension><ExtName>PseudoProductType</ExtName><ExtValue datatype="String"></ExtValue></Extension></Extensions>
</NTMTrade>
</NTMMessage>

xml转map方法:

/** * xml转map 不带属性 * @param xmlStr * @param needRootKey 是否需要在返回的map里加根节点键 * @return * @throws DocumentException */  public static Map xml2map(String xmlStr, boolean needRootKey) throws DocumentException {  SAXReader reader = new SAXReader(); Document doc = reader.read(xmlStr);  Element root = doc.getRootElement();  Map<String, Object> map = (Map<String, Object>) xml2map(root);  if(root.elements().size()==0 && root.attributes().size()==0){  return map;  }  if(needRootKey){  //在返回的map里加根节点键(如果需要)  Map<String, Object> rootMap = new HashMap<String, Object>();  rootMap.put(root.getName(), map);  return rootMap;  }  return map;  }  /** * xml转map 带属性 * @param xmlStr * @param needRootKey 是否需要在返回的map里加根节点键 * @return * @throws DocumentException */  public static Map xml2mapWithAttr(String xmlStr, boolean needRootKey) throws DocumentException {  SAXReader reader = new SAXReader(); Document doc = reader.read(xmlStr);  Element root = doc.getRootElement();  Map<String, Object> map = (Map<String, Object>) xml2mapWithAttr(root);  if(root.elements().size()==0 && root.attributes().size()==0){  return map; //根节点只有一个文本内容
        }  if(needRootKey){  //在返回的map里加根节点键(如果需要)  Map<String, Object> rootMap = new HashMap<String, Object>();  rootMap.put(root.getName(), map);  return rootMap;  }  return map;  }  /** * xml转map 不带属性 * @param e * @return */  @SuppressWarnings("unchecked")private static Map xml2map(Element e) {  Map map = new LinkedHashMap();  List list = e.elements();  if (list.size() > 0) {  for (int i = 0; i < list.size(); i++) {  Element iter = (Element) list.get(i);  List mapList = new ArrayList();  if (iter.elements().size() > 0) {  Map m = xml2map(iter);  if (map.get(iter.getName()) != null) {  Object obj = map.get(iter.getName());  if (!(obj instanceof List)) {  mapList = new ArrayList();  mapList.add(obj);  mapList.add(m);  }  if (obj instanceof List) {  mapList = (List) obj;  mapList.add(m);  }  map.put(iter.getName(), mapList);  } else  map.put(iter.getName(), m);  } else {  if (map.get(iter.getName()) != null) {  Object obj = map.get(iter.getName());  if (!(obj instanceof List)) {  mapList = new ArrayList();  mapList.add(obj);  mapList.add(iter.getText());  }  if (obj instanceof List) {  mapList = (List) obj;  mapList.add(iter.getText());  }  map.put(iter.getName(), mapList);  } else  map.put(iter.getName(), iter.getText());  }  }  } else  map.put(e.getName(), e.getText());  return map;  }  /** * xml转map 带属性 * @param e * @return */  @SuppressWarnings("unchecked")private static Map xml2mapWithAttr(Element element) {  Map<String, Object> map = new LinkedHashMap<String, Object>();  List<Element> list = element.elements();  List<Attribute> listAttr0 = element.attributes(); // 当前节点的所有属性的list  for (Attribute attr : listAttr0) {  map.put("@" + attr.getName(), attr.getValue());  }  if (list.size() > 0) {  for (int i = 0; i < list.size(); i++) {  Element iter = list.get(i);  List mapList = new ArrayList();  if (iter.elements().size() > 0) {  Map m = xml2mapWithAttr(iter);  if (map.get(iter.getName()) != null) {  Object obj = map.get(iter.getName());  if (!(obj instanceof List)) {  mapList = new ArrayList();  mapList.add(obj);  mapList.add(m);  }  if (obj instanceof List) {  mapList = (List) obj;  mapList.add(m);  }  map.put(iter.getName(), mapList);  } else  map.put(iter.getName(), m);  } else {  List<Attribute> listAttr = iter.attributes(); // 当前节点的所有属性的list  Map<String, Object> attrMap = null;  boolean hasAttributes = false;  if (listAttr.size() > 0) {  hasAttributes = true;  attrMap = new LinkedHashMap<String, Object>();  for (Attribute attr : listAttr) {  attrMap.put("@" + attr.getName(), attr.getValue());  }  }  if (map.get(iter.getName()) != null) {  Object obj = map.get(iter.getName());  if (!(obj instanceof List)) {  mapList = new ArrayList();  mapList.add(obj);  // mapList.add(iter.getText());  if (hasAttributes) {  attrMap.put("#text", iter.getText());  mapList.add(attrMap);  } else {  mapList.add(iter.getText());  }  }  if (obj instanceof List) {  mapList = (List) obj;  // mapList.add(iter.getText());  if (hasAttributes) {  attrMap.put("#text", iter.getText());  mapList.add(attrMap);  } else {  mapList.add(iter.getText());  }  }  map.put(iter.getName(), mapList);  } else {  // map.put(iter.getName(), iter.getText());  if (hasAttributes) {  attrMap.put("#text", iter.getText());  map.put(iter.getName(), attrMap);  } else {  map.put(iter.getName(), iter.getText());  }  }  }  }  } else {  // 根节点的  if (listAttr0.size() > 0) {  map.put("#text", element.getText());  } else {  map.put(element.getName(), element.getText());  }  }  return map;  }  

执行方法

public static void main(String[] args) throws DocumentException, IOException {  String textFromFile = "PMEXCH.xml";  Map<String, Object> string=xml2mapWithAttr(textFromFile,false);
}

结果是:

{@version=1.03, NTMHeader={MessageID= MessageID , MessageSource={SystemID= SystemID_1 , Location= Location_1 , UserID= UserID_1 }, Timezone=Timezone, DateFormat={@format=ISO8601, #text=}, GeneratedTime= GeneratedTime , PublishResponse={@value=JustLogs, #text=}, TransactMessage={@value=NoTransact, #text=}}, NTMTrade={TradeHeader={SysTradeID={SystemID= SystemID_2 , Location= Location_2 , TradeID= TradeID }, TradeDate= TradeDate , OriginEntity={Entity={@role=Owner, Organization= Organization_1 , Trader= Trader }}, OtherEntity={Entity={@role=Counterparty, Organization= Organization_2 }}, InterestedParties={Entity=[{@role=Broker, Organization= Organization_3 }, {@role=Custodian, Organization= Organization_4 }]}, TradeDescription= TradeDescription , TradeRole={@value=Actual, #text=}, TradeMessageRole={@value=New, #text=}, Notes= Notes_1 , ProcessHistory={ProcessAction={ProcessName=ProcessName, ProcessedOK={@value=Yes, #text=}, Notes= Notes_2 }}}, TradeTags={TradingArea= TradingArea , AccountingArea= AccountingArea , AccountingGroup= AccountingGroup , TicketID= TicketID , Extensions={Extension=[{ExtName= ExtName_1 , ExtValue={@datatype=String, #text=}}, {ExtName= ExtName_2 , ExtValue={@datatype=String, #text=}}, {ExtName=ExtName_3, ExtValue={@datatype=Datetime, #text=}}, {ExtName=ExtName_4, ExtValue={@datatype=String, #text=}}]}}, FX={FXRate={NumeratorCCY={CCY= CCY_1 }, DenominatorCCY={CCY= CCY_2 }, Rate= Rate }, BuyCFL={Cashflow={@CFLType=Principal, CashflowID= CashflowID_1 , CashflowPayment={PayDate= PayDate_1 , Amount= amount_1 , CCY= CCY_3 }}}, SellCFL={Cashflow={@CFLType=Principal, CashflowID= CashflowID_2 , CashflowPayment={PayDate= PayDate_2 , Amount= amount_2 , CCY= CCY_4 }}}}, Extensions={Extension=[{ExtName= ExtName_5 , ExtValue={@datatype=String, #text=}}, {ExtName= ExtName_6 , ExtValue={@datatype=String, #text=}}]}}}

map转xml的方法

/*** map转xml map中没有根节点的键* * @param map* @param rootName*            父节点* @throws DocumentException* @throws IOException*/public static Document mapToxml(Map<String, Object> map, String rootName)throws DocumentException, IOException {Document doc = DocumentHelper.createDocument();Element root = DocumentHelper.createElement(rootName);doc.add(root);mapToxml(map, root);return doc;}/*** map转xml map中含有根节点的键* * @param map* @throws DocumentException* @throws IOException*/@SuppressWarnings({ "unchecked", "rawtypes" })public static Document mapToxml(Map<String, Object> map)throws DocumentException, IOException {Iterator<Map.Entry<String, Object>> entries = map.entrySet().iterator();if (entries.hasNext()) {// 获取第一个键创建根节点Map.Entry<String, Object> entry = entries.next();Document doc = DocumentHelper.createDocument();Element root = DocumentHelper.createElement(entry.getKey());doc.add(root);mapToxml((Map) entry.getValue(), root);return doc;}return null;}/*** map转xml* * @param map* @param body*            xml节点元素* @return*/@SuppressWarnings({ "unchecked", "rawtypes" })private static Element mapToxml(Map<String, Object> map, Element body) {Iterator<Map.Entry<String, Object>> entries = map.entrySet().iterator();while (entries.hasNext()) {// 遍历entriesMap.Entry<String, Object> entry = entries.next();String key = entry.getKey();Object value = entry.getValue();if (key.startsWith("@")) { // 属性body.addAttribute(key.substring(1, key.length()),value.toString());} else if (key.equals("#text")) { // 有属性时的文本
                body.setText(value.toString());} else {if (value instanceof java.util.List) {List list = (List) value;Object obj;for (int i = 0; i < list.size(); i++) {obj = list.get(i);// list里是map或String,不会存在list里直接是list的,if (obj instanceof java.util.Map) {Element subElement = body.addElement(key);mapToxml((Map) list.get(i), subElement);} else {body.addElement(key).setText((String) list.get(i));}}} else if (value instanceof java.util.Map) {Element subElement = body.addElement(key);mapToxml((Map) value, subElement);} else {body.addElement(key).setText(value.toString());}}}return body;}

格式化xml

/*** 格式化输出xml* * @param xmlStr*            xml文件* @return* @throws DocumentException* @throws IOException*/public static String formatXml(String xmlStr) throws DocumentException,IOException {Document document = DocumentHelper.parseText(xmlStr);return formatXml(document);}/*** 格式化输出xml* * @param document* @return* @throws DocumentException* @throws IOException*/public static String formatXml(Document document) throws DocumentException,IOException {// 格式化输出格式OutputFormat format = OutputFormat.createPrettyPrint();StringWriter writer = new StringWriter();// 格式化输出流XMLWriter xmlWriter = new XMLWriter(writer, format);// 将document写入到输出流
        xmlWriter.write(document);xmlWriter.close();return writer.toString();}执行结果
<NTMMessage version="1.03">
<NTMHeader><MessageID>1711030000054</MessageID><MessageSource><SystemID>MNLN</SystemID><Location>CITIC</Location><UserID>dlm3</UserID></MessageSource><Timezone>GMT</Timezone><DateFormat format="ISO8601"/><GeneratedTime>2017-11-03T08:02:54</GeneratedTime><PublishResponse value="JustLogs"></PublishResponse><TransactMessage value="NoTransact"></TransactMessage>
</NTMHeader>
<NTMTrade><TradeHeader><SysTradeID><SystemID>MNLN</SystemID><Location>CITIC</Location><TradeID>GFWD1700000943</TradeID></SysTradeID><TradeDate>2017-11-03T08:02:54</TradeDate><OriginEntity><Entity role="Owner"><Organization>SHZH00</Organization><Trader>WHWH</Trader></Entity></OriginEntity><OtherEntity><Entity role="Counterparty"><Organization>SHZH00</Organization></Entity></OtherEntity><InterestedParties><Entity role="Broker"><Organization></Organization></Entity><Entity role="Custodian"><Organization></Organization></Entity></InterestedParties><TradeDescription>201711030000172</TradeDescription><TradeRole value="Actual"/><TradeMessageRole value="New"/><Notes>PANORAMA INTERFACE</Notes><ProcessHistory><ProcessAction><ProcessName>EraYTInterface</ProcessName><ProcessedOK value="Yes"/><Notes>EraYTInterface</Notes></ProcessAction></ProcessHistory></TradeHeader><TradeTags><TradingArea>TXAU</TradingArea><AccountingArea>AA1</AccountingArea><AccountingGroup>DD</AccountingGroup><TicketID></TicketID><Extensions><Extension><ExtName>AccType</ExtName><ExtValue datatype="String"></ExtValue></Extension><Extension><ExtName>ContractCode</ExtName><ExtValue datatype="String">AUY-CNY/FX</ExtValue></Extension><Extension><ExtName>UserTradeDate</ExtName><ExtValue datatype="Datetime">2017-11-03T08:02:54</ExtValue></Extension><Extension><ExtName>TradeOwner</ExtName><ExtValue datatype="String"></ExtValue></Extension></Extensions></TradeTags><FX><FXRate><NumeratorCCY><CCY>AUY</CCY></NumeratorCCY><DenominatorCCY><CCY>CNY</CCY></DenominatorCCY><Rate>273.69</Rate></FXRate><BuyCFL><Cashflow CFLType="Principal"><CashflowID>1</CashflowID><CashflowPayment><PayDate>2018-02-07</PayDate><Amount>-90.0</Amount><CCY>AUY</CCY></CashflowPayment></Cashflow></BuyCFL><SellCFL><Cashflow CFLType="Principal"><CashflowID>2</CashflowID><CashflowPayment><PayDate>2018-02-07</PayDate><Amount>24632.1</Amount><CCY>CNY</CCY></CashflowPayment></Cashflow></SellCFL></FX><Extensions><Extension><ExtName>PseudoProduct</ExtName><ExtValue datatype="String"></ExtValue></Extension><Extension><ExtName>PseudoProductType</ExtName><ExtValue datatype="String"></ExtValue></Extension></Extensions>
</NTMTrade>
</NTMMessage>

 

转载于:https://www.cnblogs.com/-zpy/p/9265920.html

解析xml报文,xml与map互转相关推荐

  1. 浅谈java封装xml报文,XML报文转JAVA对象-JAVA对象转XML报文

    JAVA 实体类 Person.java public class Person { private int id; private String username; private String a ...

  2. vba xml 怎么设置父节点_熊二做了一个xml报文处理的开源库easyxml

    ❝ 自信.冷静.专注.-- TM 熊的自我勉励 ❞ 1. 前言 熊二从去年开始,因项目需求接触到xml报文的处理,也是我第一次学习用C/C++的方式处理基于DOM模型的xml报文.因为本人比较懒hhh ...

  3. java 8583报文解析_ISO8583报文工具类(组装和解析报文) | 学步园

    很久没来csdn了.现在的工作地点在银行,妈的,不让上网啊. 写写博客其实是对自己知识的总结,这么长时间了,也该写点东西了.接触银行的项目,避免不了 遇上8583报文.具体介绍就不细讲了,这个网上一大 ...

  4. Java实现xml与map互转

    此文档中包含单层和多层嵌套情况下,xml和map集合进行互转,具体代码如下: import java.util.HashMap; import java.util.List; import java. ...

  5. JAVA解析xml报文

    目录 问题需求 响应报文格式 1,开发导入的依赖 2,开发样例 3,测试结果 问题需求 在工作中此项目请求指定项目之后,项目会返回一个xml报文格式的响应,此时我需要判断返回的报文是否是成功的响应报文 ...

  6. Java 解析 XML 报文示例

    在与其他公司,尤其是国企项目(如公安系统,银保监等系统)对接接口时,对方经常要求入参或者返回参数需要传 XML 格式报文. 请求他们接口需要自己将参数拼接成XML格式,获取他们返回参数时,需要根据接口 ...

  7. java解析xml报文_java 如何解析http请求返回的xml报文

    xml报文解析方法有很多种,此处采用dom4j的方法. dom4j的jar包下载地址:https://dom4j.github.io/# 1.request.getInputStream()和new ...

  8. Java解析XML报文内容及标签属性

    前言 JSON格式的报文解析,虽然json串短小精悍,也能有效表达层次结构,但是每个元素只能找到对应的元素值,不能体现更丰富的样式特征.比如某个元素除了要传输它的字符串文本,还想传输该文本的类型.字体 ...

  9. Java开发笔记XML报文的解析

    Java开发笔记XML报文的解析 前言 正文 代码示例 结语 前言 项目任务里需要解析xml报文. 于是开始着手学习相关知识,在查看了多篇博文后找到了一篇不错的,讲的很实用. 转载来源:Java开发笔 ...

最新文章

  1. c语言经典算法大全pdf,c语言经典算法100例pdf版.pdf
  2. RabbitMQ学习总结(8)——RabbitMQ后台管理控制台页面属性总结
  3. php eval 安全性,php – 使用eval解析表单输入的方程式的最安全的方法
  4. 内存颗粒和闪存颗粒的区别_国产闪存颗粒终于熬出头 紫光存储S100固态硬盘评测...
  5. 关于yum网络版仓库(本地yum仓库的安装配置,如果没网了,做一个局域网内的yum仓库)...
  6. CentOS搭建Ghost博客
  7. 聊天系统服务器端类图,课程设计-简单聊天室JAVA课程设计.doc
  8. wordpress短代码转php,七个超级实用的WordPress 短代码
  9. word分页符的删除
  10. c++ Bellman-Ford 算法
  11. 如何选择适合你的兴趣爱好(十五),油画
  12. 互联网晚报 | 7月9日 星期六 |马斯克终止收购推特;​B 站回应 2 亿余条用户账号疑泄露传闻;上海逐步开放电影院和演出场所...
  13. Pytorch官方教程练习之数据加载和处理
  14. UIButton 获取网络图片的排版技巧
  15. 音频立体声转单声道(音频双通道转单通道)
  16. TransR 论文笔记
  17. 贷前审查和贷中审查_大技术受到审查
  18. 【笑话】金庸笔下的武侠如何杀苍蝇
  19. UNKNOWN.RPT 无法将请求提交后台处理
  20. U盘装系统_官方镜像

热门文章

  1. 数字图像处理课程 复习重点
  2. tiny4412 linux-4.2 移植(九)USB 2.0 host框架(4)支持otg
  3. Android提权漏洞CVE-2014-7920、CVE-2014-7921
  4. 如何看待海淀某互联网公司让员工住在公司?(爆公司信息)
  5. 关于浮点数规格化表示的问题
  6. 【总结】FFT算法在信息竞赛中的应用
  7. html兼容模式下不显示图片,html 兼容性问题及一些处理方法(1)
  8. 小菜版考试系统——“C”
  9. 2001-使用Hive+MR统计分析网站指标
  10. python sklearn 置信概率