解析xml报文,xml与map互转

这段时间写了一个关于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

时间: 2024-10-27 12:11:13

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

dom4j解析xml报文

package com.answern.claimv2.service.utils; import com.alibaba.dubbo.common.utils.IOUtils; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import java.io.File; import java.util.

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

xml报文解析方法有很多种,此处采用dom4j的方法. dom4j的jar包下载地址:https://dom4j.github.io/# 1.request.getInputStream()和new SAXReader().read(输入流): 返回的报文如下: <?xml version="1.0" encoding="UTF-8"?><CreateAccessKeyResponse> <CreateAccessKeyResult&g

xml与map互转

/**  * 将Map转为XML,默认root标签为PACKET:  * 由于List中的元素没有名称,默认将List的名称_LIST>部分替换为_INFO>,作为List中元素的名字:  * 暂不考虑List中的元素也是List的情况.  * @param version 例如1.0  * @param encoding 例如UTF-8或者GBK  * @param packetType 例如REQUEST或者RESPONSE  * @param requestType 例如N01  * @

PHP通过XML报文方式,已第三方接口交互(发送xml,获取XML,并解析xml步骤)

开发者端:发送请求,并接收结果 <?php // 下面的demo,实现的功能如下: // 1-开发者需要判断一个用户是否存在,去请求第三方接口. // 2-与第三方接口的通信,是以xml格式传送数据.开发者把用户信息以xml格式发送给第三方接口 // 3-第三方接口获取开发者的xml数据,通过数据的查询,把结果再以xml的格式发送给开发者. //首先检测是否支持curl if (!extension_loaded("curl")) { trigger_error("对不

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

开发者端:发送请求,并接收结果 <?php // 下面的demo,实现的功能如下: // 1-开发者需要判断一个用户是否存在,去请求第三方接口. // 2-与第三方接口的通信,是以xml格式传送数据.开发者把用户信息以xml格式发送给第三方接口 // 3-第三方接口获取开发者的xml数据,通过数据的查询,把结果再以xml的格式发送给开发者. //首先检测是否支持curl if (!extension_loaded("curl")) { trigger_error("对不

Mybatis3源码分析(三):解析mapper的xml配置文件

这一章我们来看看mybatis是怎么读取mapper的xml配置文件并解析其中的sql语句. 我们还记得是这样配置sqlSessionFactory的: <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" />

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

1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.example.demo1" /> 上面targetPackage指定的包要和应用的package相同. (2)在清单文件中ap

XML系列:(4)XML解析-JAXP的DOM解析方式读取XML

DOM.SAX和StAX只是解析方式,没有API. JAXP是SUN提供的一套XML解析API.    JAXP(Java API for XMLProcessing,意为XML处理的Java API) JAXP很好的支持DOM和SAX解析. JAXP开发包是JAVASE的一部分,它由java.xml.org.w3c.dom.org.xml.sax包及其子包组成 products.mxl <?xml version="1.0" encoding="UTF-8"

XML与Object之间的互转

private static final String W3C_XML_SCHEMA_NS_URI = "http://www.w3.org/2001/XMLSchema"; /** 将对象转换成xml @param obj 要转成xml的对象 @param xsdPath 标准的xml文件就传null @return xml格式的字符串*/public static String objToXml(Object obj, String xsdPath) throws JAXBExce