这段时间写了一个关于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>
原文:https://www.cnblogs.com/-zpy/p/9265920.html