这段时间写了一个关于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()) {
// 遍历entries
Map.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>

 

解析xml报文,xml与map互转的更多相关文章

  1. xml报文解析和组装

    package com.xjts.cipher.util;import java.io.File;import java.io.FileWriter;import java.io.IOExceptio ...

  2. xml报文的装配解析

    xstream dom 将map自动转化为xml报文 http://blog.csdn.net/lisheng19870305/article/details/45847985 报文的通信

  3. Java开发笔记(一百零九)XML报文的定义和解析

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

  4. java 写webservice接口解析xml报文

    1 <!--解析xml报文--> 2 <dependency> 3 <groupId>dom4j</groupId> 4 <artifactId& ...

  5. PHP通过XML报文格式的POST请求方式,与第三方接口交互(发送xml,获取XML,并解析xml步骤)

    开发者端:发送请求,并接收结果 <?php // 下面的demo,实现的功能如下: // 1-开发者需要判断一个用户是否存在,去请求第三方接口. // 2-与第三方接口的通信,是以xml格式传送 ...

  6. 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

    1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...

  7. 在.NET2.0中解析Json和Xml

    在.NET解析json有很多方法,这里介绍最简单也用的最多的一种. 一.添加引用 解析Json,先下载开源控件 Newtonsoft.Json.dll 下载地址:http://files.cnblog ...

  8. Xml格式数据转map工具类

    前言[ 最近在写一个业务,由于调UPS物流的接口返回的是一个xml格式的数据结果,我现在要拿到xml中某个节点的值,而这个xml数据是多节点多层级的,并且这某个节点的值有可能只有一条值,有可能有多条, ...

  9. Xml解析作业与Xml建模andXml建模作业

    作业:config.xml解析 1.获取所有action中的type的值 public static void main(String[] args) throws Exception { Input ...

随机推荐

  1. PHP类的静态(static)方法和静态(static)变量使用介绍

    PHP类的静态(static)方法和静态(static)变量使用介绍,学习php的朋友可以看下     在php中,访问类的方法/变量有两种方法: 1. 创建对象$object = new Class ...

  2. AE-----界面介绍

    AE-----界面介绍 一.大纲leiji 层级: 比如:高楼一层一层的盖起来的.千层蛋糕(一层一层的).地质(一层一层构造的) 图层的特征:有顺序.上面的一层总会覆盖掉下面的一层. AfterEff ...

  3. pip问题解决方案

    错误信息:usr/bin/pip: No such file or directory 解决办法(一共四步,按照下面的步骤来从1到4,最后你会发现问题都解决了): 1.which pip /usr/l ...

  4. java学习笔记-JavaWeb篇四

    86 文件上传基础 87 使用 fileupload 组件 88 文件上传案例_需求 89 文件上传案例_JS代码 90 文件上传案例_约束的可配置性 91 文件上传案例_总体步骤分析 92 文件上传 ...

  5. kubernetes pvc pv 坑

    这里遇到一个问题,开始建立的pv死活claim为空,查看pv以及pvc的配置发现并没有任何名称上的关联,继续研究,发现纯粹是通过storage大小进行匹配的,之前因为照抄书本,一个是5G,一个是8G所 ...

  6. sed 替换有单引号的行

    cat test.txt $config['useragent'] = 'Roundcube Webmail'; // Hide version number//$config['username_d ...

  7. rpm-yum_install_software

    rpm -ivh software_name安装软件 打印详情rpm -q software_name查询软件是否安装rpm -ql software_name查询安装目录rpm -e softwar ...

  8. mac最常用快捷键

    本人使用的是18款512g的macbookpro<后续简称mbp>,已升级最新mojave系统. 以下是我平时记录.也是使用最多的快捷键,惠存.     1.切换拼音和字母 control ...

  9. iview的Affix插件遇到滚动时候的bug处理方法

    最近有个需求,是用vue做的页面,其中嵌入了一个tinymce编辑器,编辑器设置了自动调整高度,也就是说编辑器中内容越多,高度就会自动撑高 我们需要再页面最下方放一个保存按钮,保存按钮必须固定在屏幕下 ...

  10. TinkerPop简述

    ThinkerPop Apache 顶级项目 概述 TinkerPop是一个面向实时事务处理(OLAP)以及批量.分析型(OLTP)的开源的图计算框架.TinkerPop是一个可以应用于不同图形数据库 ...