/* 履歴: NO 日付 内容 001 2021.04.26 新規作成 */ package com.galaxygoby; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; /** *
*
クラス概要: *
xmlファイルの読込みおよび解析、情報返却を実行するクラス *
*/ public class ShmXMLList { /** 空行 */ private static final String BLANK = ""; /** スラッシュ */ private static final String SLASH = "/"; /** アットマーク */ private static final String AMARK = "@"; /** スラッシュ、アットマーク */ private static final String SLASH_AMARK = "/@"; /** スラッシュ、アットマーク、文字列(text) */ private static final String SLASH_AMARK_TEXT = "/@text"; /** 等号(=) */ private static final String EQUAL = "="; /** 文字列(parm) */ private static final String STR_PARM = "parm"; /** 文字列(tag) */ private static final String STR_TAG = "tag"; /** 文字列(text) */ private static final String STR_TEXT = "text"; /** 文字列(#text) */ private static final String STR_SHARP_TEXT = "#text"; /** 文字列(pval) */ private static final String STR_PVAL = "pval"; /** 改行コード */ private static final String BREAK_CODE = "\n"; /** タブコード */ private static final String TAB_CODE = "\t"; /** アットマーク(char型) */ private static final char CHAR_AMARK = '@'; /** 区切り文字 */ public static final String SEP_XML = "\0"; List> xmlList = new ArrayList>(); // Node root = null; Document root = null; int NodesNum = 0; /** *
*
コンストラクタ。 *
指定されたファイルから、再帰的に情報解析を行い、xmlListに情報を格納する *
* * @param file xmlファイル名称 */ public ShmXMLList(String file) { DocumentBuilderFactory factory; DocumentBuilder builder; // Node child; // NodeList XMLdata; try { factory = DocumentBuilderFactory.newInstance(); builder = factory.newDocumentBuilder(); factory.setIgnoringElementContentWhitespace(true); factory.setIgnoringComments(true); factory.setValidating(false); // root = (Node)builder.parse(file); root = builder.parse(file); } catch (ParserConfigurationException e0) { throw new RuntimeException(e0); } catch (SAXException e1) { throw new RuntimeException(e1); } catch (IOException e2) { throw new RuntimeException(e2); } setList(); } /** *
*
コンストラクタが生成した「List> xmlList」をそのまま返却する。 *
*/ public List> getList() { return (xmlList); } /** *
*
tree指定された情報を元にxmlListから必要な情報を返却する。 *
* 例) 0,5 (1) * 上記のxmlファイルから、キー情報(0,5)を取得する場合、 「/Sort/SortInfo/Keys」をKeyに指定する。 (2) 上記のxmlファイルから、キー情報のTパラメータ(String)を取得する場合、 * 「/Sort/SortInfo/Keys/@T」をKeyに指定する。 * * @param Key 検索キー情報。 * @return 検索キーにマッチした要素を返却。マッチする要素が複数あれば、全て返却する。 */ public String[] getValue(String Key) { List val = new ArrayList(); // if (Key.substring(0,1).equals("/") == false) { if (SLASH.equals(Key.substring(0, 1)) == false) { val = (List)null; return (null); } String[] tag = Key.split(SLASH); for (int i = 0; i < xmlList.size(); i++) { List xmlData = xmlList.get(i); int j = 1; int k = 0; for (; j < tag.length && k < xmlData.size() - 1; j++, k += 2) { // if (tag[j].substring(0,1).equals("@") == true) { if (AMARK.equals(tag[j].substring(0, 1)) == true) { for (; k < xmlData.size(); k += 2) { // OKケース // if (xmlData.get(k).equals("parm") == true && if (STR_PARM.equals(xmlData.get(k)) == true && (AMARK + xmlData.get(k + 1)).equals(tag[j]) == true) { break; } // NGケース // if (xmlData.get(k).equals("tag") == true || // xmlData.get(k).equals("text") == true) { if (STR_TAG.equals(xmlData.get(k)) == true || STR_TEXT.equals(xmlData.get(k)) == true) { break; } } break; } else { for (; k < xmlData.size(); k += 4) { // if (xmlData.get(k).equals("tag") == true) { if (STR_TAG.equals(xmlData.get(k)) == true) { break; } } // NGケース if (k >= xmlData.size()) { break; } if (xmlData.get(k + 1).equals(tag[j]) == false) { break; } // OKケース if (j == tag.length - 1) { break; } } } /* * if ( k < xmlData.size() ) { * System.out.println("j="+j+" tag.length="+tag.length+" k="+k+" xmlData.get(k)="+xmlData.get(k)) ; } else { * System.out.println("j="+j+" tag.length="+tag.length+" k="+k) ; } */ if (j == tag.length - 1 && k < xmlData.size() - 1 && // xmlData.get(k).equals("tag") == true && STR_TAG.equals(xmlData.get(k)) == true && xmlData.get(k + 1).equals(tag[j]) == true) { k += 2; for (; k < xmlData.size(); k += 2) { // if ( xmlData.get(k).equals("text") == true ) { if (STR_TEXT.equals(xmlData.get(k)) == true) { val.add(xmlData.get(k + 1)); break; } // if ( xmlData.get(k).equals("tag") == true ) { if (STR_TAG.equals(xmlData.get(k)) == true) { break; } } } else if (j == tag.length - 1 && k < xmlData.size() - 1 && STR_PARM.equals(xmlData.get(k)) == true) { // xmlData.get(k).equals("parm") == true ) { k += 2; // if ( xmlData.get(k).equals("pval") == true ) { if (STR_PVAL.equals(xmlData.get(k)) == true) { val.add(xmlData.get(k + 1)); } } } // System.out.println("val.size()=" + val.size()) ; if (val.size() <= 0) { val = (List)null; return (null); } String[] ret = new String[val.size()]; for (int i = 0; i < val.size(); i++) { ret[i] = val.get(i); } return (ret); } public String[][] getFrame(String prmDir) { List prmList = new ArrayList(); String[] word = prmDir.split(SLASH); for (int i = 1; i < word.length; i++) { // if (word[i].indexOf('@') >= 0) { if (word[i].indexOf(CHAR_AMARK) >= 0) { String[] word1 = word[i].split(AMARK); for (int j = 1; j < word1.length; j++) { String[] word2 = word1[j].split(EQUAL); // prmList.add("parm"); prmList.add(STR_PARM); prmList.add(word2[0]); // prmList.add("pval"); prmList.add(STR_PVAL); prmList.add(word2[1]); } } else { // prmList.add("tag"); prmList.add(STR_TAG); prmList.add(word[i]); } } List retValue1 = getFrame((String[])prmList.toArray(new String[0])); if (retValue1 == null) { return (null); } List retValue2 = new ArrayList(); for (int i = 0; i < retValue1.size(); i++) { // String[] word1 = retValue1.get(i).split("\0"); String[] word1 = retValue1.get(i).split(SEP_XML); String word2 = BLANK; for (int j = 0; j < word1.length;) { // if (word1[j].equals("tag") == true) { if (STR_TAG.equals(word1[j]) == true) { word2 += SLASH + word1[j + 1]; j += 2; } else // if (word1[j].equals("parm") == true) { if (STR_PARM.equals(word1[j]) == true) { if (word2.equals(BLANK) == true && i > 0) { j += 4; continue; } // retValue2.add(word2 + "/@" + word1[j+1]); retValue2.add(word2 + SLASH_AMARK + word1[j + 1]); retValue2.add(word1[j + 3]); j += 4; } else // if (word1[j].equals("text") == true) { if (STR_TEXT.equals(word1[j]) == true) { // retValue2.add(word2 + "/@text"); retValue2.add(word2 + SLASH_AMARK_TEXT); retValue2.add(word1[j + 1]); j += 2; } } } String ret[][] = new String[retValue2.size() / 2][2]; for (int i = 0; i < retValue2.size(); i += 2) { ret[i / 2][0] = retValue2.get(i); ret[i / 2][1] = retValue2.get(i + 1); } return (ret); } /** *
*
構造化指定された情報を元にxmlListから必要な情報を返却する。
* 例) 0,5 0 (1) 上記のxmlファイルから、ID="SORT_TEST2"配下を全て取得する場合、 「tag * Sort tag SortInfo parm ID pval SORT_TEST2」をprmに指定する。(タブ区切り) 返却値は、下記のフォーマットで返却を行う 「tag Sort tag SortInfo parm ID pval * SORT_TEST2 parm TYP pval VARIABLE tag Keys parm T pval Integer parm parm S pval desc text 0」 * * @param prm 検索キー情報。 * @return 検索キーにマッチしたフレーム要素を返却。マッチする要素が複数あれば、List形式で全て返却する。 */ public List getFrame(String[] prm) { List retValue = new ArrayList(); // for ( int i=0 ; i xmlData = xmlList.get(i); for (j = 0; j < prm.length; j++) { // System.out.println ( "prm[" + j + "]=" + prm[j] ) ; // System.out.println ( "xmlData.get(" + j + ")=" + xmlData.get(j) ) ; // if (prm[j].equals("") == true || prm[j].equals(xmlData.get(j)) == true) { if (BLANK.equals(prm[j]) == true || prm[j].equals(xmlData.get(j)) == true) { continue; } else { break; } } if (j == prm.length) { String retStr = new String(); String sep = BLANK; for (; j < xmlData.size(); j++) { retStr += sep + xmlData.get(j); // sep = "\0"; sep = SEP_XML; } retValue.add(retStr); found = 1; } else { if (found == 1) { break; } } } if (retValue.size() <= 0) { retValue = (List)null; } return (retValue); } /** *
*
nodeの子ノードを全てList>にセットする。(再帰処理をしているので注意) *
*/ private void setList() { showNodes(root, null); for (int i = 0; i < xmlList.size() - 1;) { List wList1 = xmlList.get(i); List wList2 = xmlList.get(i + 1); int k = 1; for (int j = 0; j < wList1.size(); j++) { if (j >= wList2.size()) { k = 2; break; } if (wList1.get(j).equals(wList2.get(j)) == false) { k = 0; break; } } if (k == 0) { i++; } else if (k == 1) { xmlList.remove(i); } else if (k == 2) { xmlList.remove(i + 1); } } return; } /** */ // private void showNodes (Node node, List wl) { private void showNodes(Document node, List wl) { NodeList nodes = node.getChildNodes(); if (nodes.getLength() == 0) { xmlList.add(wl); } NodesNum = nodes.getLength(); for (int i = 0; i < nodes.getLength(); i++) { List ls = new ArrayList(); if (wl != null && wl.size() > 0) { for (int k = 0; k < wl.size(); k++) { ls.add(wl.get(k)); } } Node node2 = (Node)nodes.item(i); String Value = null; if (node2.getNodeValue() != null) { // Value = node2.getNodeValue().replaceAll("\n", ""); // Value = Value.replaceAll("\t", ""); Value = node2.getNodeValue().replaceAll(BREAK_CODE, BLANK); Value = Value.replaceAll(TAB_CODE, BLANK); } // if (Value != null && Value.equals("") == true) { if (Value != null && BLANK.equals(Value) == true) { } else { // if (node2.getNodeName().equals("#text") == false) { if (STR_SHARP_TEXT.equals(node2.getNodeName()) == false) { // ls.add("tag"); ls.add(STR_TAG); ls.add(node2.getNodeName()); } if (Value != null) { // ls.add("text"); ls.add(STR_TEXT); ls.add(Value); } for (int j = 0; node2.getAttributes() != null && node2.getAttributes().item(j) != null; j++) { // ls.add("parm"); ls.add(STR_PARM); ls.add(node2.getAttributes().item(j).getNodeName()); // ls.add("pval"); ls.add(STR_PVAL); ls.add(node2.getAttributes().item(j).getNodeValue()); } } showNodes(node2, ls); } } /** */ private void showNodes(Node node, List wl) { NodeList nodes = node.getChildNodes(); if (nodes.getLength() == 0) { xmlList.add(wl); } NodesNum = nodes.getLength(); for (int i = 0; i < nodes.getLength(); i++) { List ls = new ArrayList(); if (wl != null && wl.size() > 0) { for (int k = 0; k < wl.size(); k++) { ls.add(wl.get(k)); } } Node node2 = (Node)nodes.item(i); String Value = null; if (node2.getNodeValue() != null) { // Value = node2.getNodeValue().replaceAll("\n", ""); // Value = Value.replaceAll("\t", ""); Value = node2.getNodeValue().replaceAll(BREAK_CODE, BLANK); Value = Value.replaceAll(TAB_CODE, BLANK); } // if (Value != null && Value.equals("") == true) { if (Value != null && BLANK.equals(Value) == true) { } else { // if (node2.getNodeName().equals("#text") == false) { if (STR_SHARP_TEXT.equals(node2.getNodeName()) == false) { // ls.add("tag"); ls.add(STR_TAG); ls.add(node2.getNodeName()); } if (Value != null) { // ls.add("text"); ls.add(STR_TEXT); ls.add(Value); } for (int j = 0; node2.getAttributes() != null && node2.getAttributes().item(j) != null; j++) { // ls.add("parm"); ls.add(STR_PARM); ls.add(node2.getAttributes().item(j).getNodeName()); // ls.add("pval"); ls.add(STR_PVAL); ls.add(node2.getAttributes().item(j).getNodeValue()); } } showNodes(node2, ls); } } }