解析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>

 

 
posted @ 2018-07-04 23:08  有朋远方来  阅读(962)  评论(0编辑  收藏  举报