返回列表 上一筆 下一筆

📄 資料內容

import org.apache.axis.message.MessageElement;

import org.w3c.dom.*;



import java.util.LinkedHashMap;



public LinkedHashMap<String, String> getTitleData(int iftSid, String userType) throws Exception {

    LinkedHashMap<String, String> map = new LinkedHashMap<>();



    IQKB_XMLSoapProxy service = new IQKB_XMLSoapProxy();

    WsGetTreeAllKBResponseWsGetTreeAllKBResult result =

            service.wsGetTreeAllKB(strValidCode, 1, channelMap.get(userType), iftSid, 1);



    MessageElement[] anyArr = result.get_any();



    LOGGER.info(vaildLog("### method:getTitleData, webservice:wsGetTreeAllKB"));

    LOGGER.info(vaildLog("### req:" + "wsGetTreeAllKB(" + strValidCode + ", 1, "

            + channelMap.get(userType) + ", " + iftSid + ", 1)"));

    LOGGER.info(vaildLog("### data:" + (anyArr != null && anyArr.length > 0 ? anyArr[0] : "null")));



    if (anyArr == null || anyArr.length == 0) {

        LOGGER.warn("getTitleData: result.get_any() is empty");

        return map;

    }



    // 1) Find <diffgram> element (skip schema)

    Element diffgram = null;

    for (MessageElement me : anyArr) {

        String ln = me.getLocalName();

        if ("diffgram".equalsIgnoreCase(ln)) {

            diffgram = me;

            break;

        }

    }

    if (diffgram == null) {

        LOGGER.warn("getTitleData: <diffgram> not found");

        return map;

    }



    // 2) Navigate into <IQKB> (sometimes data root is here)

    Element dataRoot = firstChildElementByLocalName(diffgram, "IQKB");

    if (dataRoot == null) dataRoot = diffgram;



    // 3) Each row is <TreeAllKB>

    NodeList rows = dataRoot.getElementsByTagName("TreeAllKB");

    if (rows == null || rows.getLength() == 0) {

        LOGGER.warn("getTitleData: no <TreeAllKB> rows inside <IQKB>");

        return map;

    }



    for (int i = 0; i < rows.getLength(); i++) {

        Element row = (Element) rows.item(i);



        // Extract fields inside the same row

        String sid  = getChildText(row, "ifq_sid");

        String name = getChildText(row, "sfq_name");



        if (!sid.isBlank()) {

            map.put(sid.trim(), name == null ? "" : name.trim());

        }

    }



    LOGGER.info("getTitleData: rows=" + rows.getLength() + ", mapped=" + map.size());

    return map;

}



/* ===================== Shared Private Helpers ===================== */



/** Find the first child element by localName or nodeName (ignores prefix) */

private static Element firstChildElementByLocalName(Element parent, String local) {

    for (Node n = parent.getFirstChild(); n != null; n = n.getNextSibling()) {

        if (n.getNodeType() == Node.ELEMENT_NODE) {

            String ln = n.getLocalName(); // may be null (no namespace)

            String nn = n.getNodeName();  // e.g. "diffgr:diffgram"

            if (local.equals(nn) || local.equalsIgnoreCase(ln)) {

                return (Element) n;

            }

        }

    }

    return null;

}



/** Get the text value of a tag (Axis compatible; avoids getTextContent()) */

private static String getChildText(Element parent, String tag) {

    NodeList nl = parent.getElementsByTagName(tag);

    if (nl == null || nl.getLength() == 0) return "";

    return getNodeTextCompat(nl.item(0)).trim();

}



/** Collect text content from TEXT_NODE or CDATA_SECTION_NODE */

private static String getNodeTextCompat(Node node) {

    if (node == null) return "";

    StringBuilder sb = new StringBuilder();

    NodeList children = node.getChildNodes();

    for (int i = 0; i < children.getLength(); i++) {

        Node c = children.item(i);

        short t = c.getNodeType();

        if (t == Node.TEXT_NODE || t == Node.CDATA_SECTION_NODE) {

            sb.append(c.getNodeValue());

        }

    }

    return sb.toString();

}

🔐 Base64 編碼內容

aW1wb3J0IG9yZy5hcGFjaGUuYXhpcy5tZXNzYWdlLk1lc3NhZ2VFbGVtZW50OwoKaW1wb3J0IG9yZy53M2MuZG9tLio7CgoKCmltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKCgoKcHVibGljIExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFRpdGxlRGF0YShpbnQgaWZ0U2lkLCBTdHJpbmcgdXNlclR5cGUpIHRocm93cyBFeGNlcHRpb24gewoKICAgIExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKCgoKICAgIElRS0JfWE1MU29hcFByb3h5IHNlcnZpY2UgPSBuZXcgSVFLQl9YTUxTb2FwUHJveHkoKTsKCiAgICBXc0dldFRyZWVBbGxLQlJlc3BvbnNlV3NHZXRUcmVlQWxsS0JSZXN1bHQgcmVzdWx0ID0KCiAgICAgICAgICAgIHNlcnZpY2Uud3NHZXRUcmVlQWxsS0Ioc3RyVmFsaWRDb2RlLCAxLCBjaGFubmVsTWFwLmdldCh1c2VyVHlwZSksIGlmdFNpZCwgMSk7CgoKCiAgICBNZXNzYWdlRWxlbWVudFtdIGFueUFyciA9IHJlc3VsdC5nZXRfYW55KCk7CgoKCiAgICBMT0dHRVIuaW5mbyh2YWlsZExvZygiIyMjIG1ldGhvZDpnZXRUaXRsZURhdGEsIHdlYnNlcnZpY2U6d3NHZXRUcmVlQWxsS0IiKSk7CgogICAgTE9HR0VSLmluZm8odmFpbGRMb2coIiMjIyByZXE6IiArICJ3c0dldFRyZWVBbGxLQigiICsgc3RyVmFsaWRDb2RlICsgIiwgMSwgIgoKICAgICAgICAgICAgKyBjaGFubmVsTWFwLmdldCh1c2VyVHlwZSkgKyAiLCAiICsgaWZ0U2lkICsgIiwgMSkiKSk7CgogICAgTE9HR0VSLmluZm8odmFpbGRMb2coIiMjIyBkYXRhOiIgKyAoYW55QXJyICE9IG51bGwgJiYgYW55QXJyLmxlbmd0aCA+IDAgPyBhbnlBcnJbMF0gOiAibnVsbCIpKSk7CgoKCiAgICBpZiAoYW55QXJyID09IG51bGwgfHwgYW55QXJyLmxlbmd0aCA9PSAwKSB7CgogICAgICAgIExPR0dFUi53YXJuKCJnZXRUaXRsZURhdGE6IHJlc3VsdC5nZXRfYW55KCkgaXMgZW1wdHkiKTsKCiAgICAgICAgcmV0dXJuIG1hcDsKCiAgICB9CgoKCiAgICAvLyAxKSBGaW5kIDxkaWZmZ3JhbT4gZWxlbWVudCAoc2tpcCBzY2hlbWEpCgogICAgRWxlbWVudCBkaWZmZ3JhbSA9IG51bGw7CgogICAgZm9yIChNZXNzYWdlRWxlbWVudCBtZSA6IGFueUFycikgewoKICAgICAgICBTdHJpbmcgbG4gPSBtZS5nZXRMb2NhbE5hbWUoKTsKCiAgICAgICAgaWYgKCJkaWZmZ3JhbSIuZXF1YWxzSWdub3JlQ2FzZShsbikpIHsKCiAgICAgICAgICAgIGRpZmZncmFtID0gbWU7CgogICAgICAgICAgICBicmVhazsKCiAgICAgICAgfQoKICAgIH0KCiAgICBpZiAoZGlmZmdyYW0gPT0gbnVsbCkgewoKICAgICAgICBMT0dHRVIud2FybigiZ2V0VGl0bGVEYXRhOiA8ZGlmZmdyYW0+IG5vdCBmb3VuZCIpOwoKICAgICAgICByZXR1cm4gbWFwOwoKICAgIH0KCgoKICAgIC8vIDIpIE5hdmlnYXRlIGludG8gPElRS0I+IChzb21ldGltZXMgZGF0YSByb290IGlzIGhlcmUpCgogICAgRWxlbWVudCBkYXRhUm9vdCA9IGZpcnN0Q2hpbGRFbGVtZW50QnlMb2NhbE5hbWUoZGlmZmdyYW0sICJJUUtCIik7CgogICAgaWYgKGRhdGFSb290ID09IG51bGwpIGRhdGFSb290ID0gZGlmZmdyYW07CgoKCiAgICAvLyAzKSBFYWNoIHJvdyBpcyA8VHJlZUFsbEtCPgoKICAgIE5vZGVMaXN0IHJvd3MgPSBkYXRhUm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVHJlZUFsbEtCIik7CgogICAgaWYgKHJvd3MgPT0gbnVsbCB8fCByb3dzLmdldExlbmd0aCgpID09IDApIHsKCiAgICAgICAgTE9HR0VSLndhcm4oImdldFRpdGxlRGF0YTogbm8gPFRyZWVBbGxLQj4gcm93cyBpbnNpZGUgPElRS0I+Iik7CgogICAgICAgIHJldHVybiBtYXA7CgogICAgfQoKCgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzLmdldExlbmd0aCgpOyBpKyspIHsKCiAgICAgICAgRWxlbWVudCByb3cgPSAoRWxlbWVudCkgcm93cy5pdGVtKGkpOwoKCgogICAgICAgIC8vIEV4dHJhY3QgZmllbGRzIGluc2lkZSB0aGUgc2FtZSByb3cKCiAgICAgICAgU3RyaW5nIHNpZCAgPSBnZXRDaGlsZFRleHQocm93LCAiaWZxX3NpZCIpOwoKICAgICAgICBTdHJpbmcgbmFtZSA9IGdldENoaWxkVGV4dChyb3csICJzZnFfbmFtZSIpOwoKCgogICAgICAgIGlmICghc2lkLmlzQmxhbmsoKSkgewoKICAgICAgICAgICAgbWFwLnB1dChzaWQudHJpbSgpLCBuYW1lID09IG51bGwgPyAiIiA6IG5hbWUudHJpbSgpKTsKCiAgICAgICAgfQoKICAgIH0KCgoKICAgIExPR0dFUi5pbmZvKCJnZXRUaXRsZURhdGE6IHJvd3M9IiArIHJvd3MuZ2V0TGVuZ3RoKCkgKyAiLCBtYXBwZWQ9IiArIG1hcC5zaXplKCkpOwoKICAgIHJldHVybiBtYXA7Cgp9CgoKCi8qID09PT09PT09PT09PT09PT09PT09PSBTaGFyZWQgUHJpdmF0ZSBIZWxwZXJzID09PT09PT09PT09PT09PT09PT09PSAqLwoKCgovKiogRmluZCB0aGUgZmlyc3QgY2hpbGQgZWxlbWVudCBieSBsb2NhbE5hbWUgb3Igbm9kZU5hbWUgKGlnbm9yZXMgcHJlZml4KSAqLwoKcHJpdmF0ZSBzdGF0aWMgRWxlbWVudCBmaXJzdENoaWxkRWxlbWVudEJ5TG9jYWxOYW1lKEVsZW1lbnQgcGFyZW50LCBTdHJpbmcgbG9jYWwpIHsKCiAgICBmb3IgKE5vZGUgbiA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7IG4gIT0gbnVsbDsgbiA9IG4uZ2V0TmV4dFNpYmxpbmcoKSkgewoKICAgICAgICBpZiAobi5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CgogICAgICAgICAgICBTdHJpbmcgbG4gPSBuLmdldExvY2FsTmFtZSgpOyAvLyBtYXkgYmUgbnVsbCAobm8gbmFtZXNwYWNlKQoKICAgICAgICAgICAgU3RyaW5nIG5uID0gbi5nZXROb2RlTmFtZSgpOyAgLy8gZS5nLiAiZGlmZmdyOmRpZmZncmFtIgoKICAgICAgICAgICAgaWYgKGxvY2FsLmVxdWFscyhubikgfHwgbG9jYWwuZXF1YWxzSWdub3JlQ2FzZShsbikpIHsKCiAgICAgICAgICAgICAgICByZXR1cm4gKEVsZW1lbnQpIG47CgogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIG51bGw7Cgp9CgoKCi8qKiBHZXQgdGhlIHRleHQgdmFsdWUgb2YgYSB0YWcgKEF4aXMgY29tcGF0aWJsZTsgYXZvaWRzIGdldFRleHRDb250ZW50KCkpICovCgpwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q2hpbGRUZXh0KEVsZW1lbnQgcGFyZW50LCBTdHJpbmcgdGFnKSB7CgogICAgTm9kZUxpc3QgbmwgPSBwYXJlbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnKTsKCiAgICBpZiAobmwgPT0gbnVsbCB8fCBubC5nZXRMZW5ndGgoKSA9PSAwKSByZXR1cm4gIiI7CgogICAgcmV0dXJuIGdldE5vZGVUZXh0Q29tcGF0KG5sLml0ZW0oMCkpLnRyaW0oKTsKCn0KCgoKLyoqIENvbGxlY3QgdGV4dCBjb250ZW50IGZyb20gVEVYVF9OT0RFIG9yIENEQVRBX1NFQ1RJT05fTk9ERSAqLwoKcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5vZGVUZXh0Q29tcGF0KE5vZGUgbm9kZSkgewoKICAgIGlmIChub2RlID09IG51bGwpIHJldHVybiAiIjsKCiAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKCiAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewoKICAgICAgICBOb2RlIGMgPSBjaGlsZHJlbi5pdGVtKGkpOwoKICAgICAgICBzaG9ydCB0ID0gYy5nZXROb2RlVHlwZSgpOwoKICAgICAgICBpZiAodCA9PSBOb2RlLlRFWFRfTk9ERSB8fCB0ID09IE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFKSB7CgogICAgICAgICAgICBzYi5hcHBlbmQoYy5nZXROb2RlVmFsdWUoKSk7CgogICAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Cgp9Cg==
返回列表 上一筆 下一筆