解析xml报文,xml与map互转
发布时间:2020-12-16 23:47:32 所属栏目:百科 来源:网络整理
导读:这段时间写了一个关于xml报文的工具类,做一下具体的讲解: xml文本 NTMMessage version="1.03"NTMHeader MessageID1711030000054/MessageID MessageSource SystemIDMNLN/SystemID LocationCITIC/Location UserIDdlm3/UserID /MessageSource TimezoneGMT/Tim
这段时间写了一个关于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>) xml2mapWithAttr(root); if(root.elements().size()==0 && root.attributes().size()==0){ return map; //根节点只有一个文本内容 } if(needRootKey){ //在返回的map里加根节点键(如果需要) Map<String,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(),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(),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,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,TradeMessageRole={@value=New,Notes= Notes_1,ProcessHistory={ProcessAction={ProcessName=ProcessName,ProcessedOK={@value=Yes,Notes= Notes_2 }}},TradeTags={TradingArea= TradingArea,AccountingArea= AccountingArea,AccountingGroup= AccountingGroup,TicketID= TicketID,Extensions={Extension=[{ExtName= ExtName_1,ExtValue={@datatype=String,{ExtName= ExtName_2,{ExtName=ExtName_3,ExtValue={@datatype=Datetime,{ExtName=ExtName_4,#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,{ExtName= ExtName_6,#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,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> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ios – 带有MagicalRecord的JSONModel
- ruby-on-rails – RSpec中“be_true”和“true”之间有什么
- oracle中lpad函数的用法详解
- 基于Flex访问Arcgis Server的rest API中的Geometry server
- 用 query 方法 获得xml 节点的值
- bboss mvc ajax响应输出中文乱码解决方法
- MSHFlexGrid中数据导入到Excel(机房问题)
- ruby-on-rails – 对于rails app,如何在html中显示多个flas
- NOR flash vs NAND flash
- xml – 如何使用log4net配置RollingFileAppender按日期和大