1

我想通过传递文件名来检索字段值。为了实现这一点,我已经实现了一个循环遍历 ISOMsg 对象的方法,然后如果它找到与传递的文件名匹配,则返回。我的要求是读取 . xml 文件一次并使用该静态映射,然后在下一次通过传递字段名称检索相应的值以实现这一点,有一种方法可以检索配置 xml 中的所有字段。

protected static void getISO8583ValueByFieldName(ISOMsg isoMsg, String fieldName) {

for (int i = 1; i <= isoMsg.getMaxField(); i++) {

  if (isoMsg.hasField(i)) {

    if (isoMsg.getPackager().getFieldDescription(isoMsg, i).equalsIgnoreCase(fieldName)) {
      System.out.println(
          "    FOUND FIELD -" + i + " : " + isoMsg.getString(i) + " " + isoMsg.getPackager()
              .getFieldDescription(isoMsg, i));
       break;

    } 
  } 
} 

}

4

2 回答 2

2

您还可以使用映射到字段编号的字段名称定义枚举。请注意,字段名称可能因打包程序而异,因此您的解决方案有点脆弱,最好使用枚举或仅使用常量。

于 2014-12-16T20:22:53.430 回答
-1

解决方案是实现一个自己的自定义映射器。这里是一个内存实现单例类,它一次读取所有配置,然后按名称提供键 ID。

 /**
 * This is an memory implementation of singleton mapper class which contains ISO8583
 * field mappings as Key Value pairs [Field Name,Field Value]
 * in order
 *
 * Created on 12/16/2014.
 */
public class ISO8583MapperFactory {

  private static Logger logger= Logger.getLogger(ISO8583MapperFactory.class);

  private static ISO8583MapperFactory instance = null;
  private static HashMap<String,Integer> fieldMapper=null;



  /**
   *
   * @throws IOException
   * @throws SAXException
   * @throws ParserConfigurationException
   */
  private ISO8583MapperFactory() throws IOException, SAXException, ParserConfigurationException {
    fieldMapper =new HashMap<String, Integer>();
    mapFields();
  }

  /**
   *
   * @throws ParserConfigurationException
   * @throws IOException
   * @throws SAXException
   */
  private void mapFields() throws ParserConfigurationException, IOException, SAXException {
    DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();


    dBuilder.setEntityResolver(new GenericPackager.GenericEntityResolver());
    //InputStream in = new FileInputStream(ISO8583Constant.ISO8583_CONFIG_FILE_NAME);

    InputStream in =  getClass().getClassLoader().getResourceAsStream(ISO8583Constant.ISO8583_CONFIG_FILE_NAME);
    Document doc = dBuilder.parse(in);


    logger.info("Root element :" + doc.getDocumentElement().getNodeName());

    if (doc.hasChildNodes()) {

      loadNodes(doc.getChildNodes(), fieldMapper);

    }
  }

  /**
   *
   * @return
   * @throws ParserConfigurationException
   * @throws SAXException
   * @throws IOException
   */
  public static ISO8583MapperFactory getInstance()
      throws ParserConfigurationException, SAXException, IOException {
    if(instance==null){
      instance=new ISO8583MapperFactory();
    }
    return instance;
  }

  /**
   *
   * @param fieldName
   * @return
   */
  public Integer getFieldidByName(String fieldName){
    return fieldMapper.get(fieldName);
  }



  /**
   * Recursive method to read all the id and field name mappings
   * @param nodeList
   * @param fieldMapper
   */
  protected void loadNodes(NodeList nodeList,HashMap<String,Integer> fieldMapper) {
    logger.info(" Invoked loadNodes(NodeList nodeList,HashMap<String,Integer> fieldMapper)");

    for (int count = 0; count < nodeList.getLength(); count++) {

      Node tempNode = nodeList.item(count);

      // make sure it's element node.
      if (tempNode.getNodeType() == Node.ELEMENT_NODE) {

        // get node name and value
        logger.info("\nNode Name =" + tempNode.getNodeName() + " [OPEN]");
        logger.info("Node Value =" + tempNode.getTextContent());


        if (tempNode.hasAttributes()) {

          // get attributes names and values
          NamedNodeMap nodeMap = tempNode.getAttributes();

          fieldMapper.put(nodeMap.getNamedItem(ISO8583Constant.FIELD_NAME).getNodeValue(),Integer.valueOf( nodeMap.getNamedItem(ISO8583Constant.FIELD_ID).getNodeValue()));

        }

        if (tempNode.hasChildNodes()) {

          // loop again if has child nodes
          loadNodes(tempNode.getChildNodes(), fieldMapper);

        }
        logger.info("Node Name =" + tempNode.getNodeName() + " [CLOSE]");


      }

    }

  }

  /**
   *
   * @return
   */
  public static HashMap<String, Integer> getFieldMapper() {
    return fieldMapper;
  }

  /**
   *
   * @param fieldMapper
   */
  public static void setFieldMapper(HashMap<String, Integer> fieldMapper) {
    ISO8583MapperFactory.fieldMapper = fieldMapper;
  }


}

例子

public static void main(String[] args) throws IOException, ISOException, InterruptedException {
try {

  ISO8583MapperFactory.getInstance().getFieldidByName("NAME");

} catch (ParserConfigurationException e) {
  e.printStackTrace();
} catch (SAXException e) {
  e.printStackTrace();
}

}

于 2014-12-16T10:09:26.930 回答