Как разобрать искаженный xml (ofx) с ofx4j? - PullRequest
2 голосов
/ 08 февраля 2010

Я отчаянно пытаюсь использовать следующую библиотеку: ofx4j . Но документация, относящаяся к разбору файла ofx, немного упрощена. Он говорит: если у вас есть файл или другой ресурс потока, вы можете прочитать его, используя экземпляр net.sf.ofx4j.io.OFXReader

Хорошо, но как мне это сделать?

Также указывается следующее: если вы хотите разархивировать OFX непосредственно в объект Java, используйте net.sf.ofx4j.io.AggregateUnmarshaller.

Хорошо, но это немного сложно для меня. Есть что-то очевидное, что я пропустил? Когда я пытаюсь использовать unmarshaller, он просит меня реализовать интерфейс.

Может ли кто-нибудь указать мне на онлайн-ресурс, объясняющий, что мне не хватает? Или лучше всего, что вы понимаете из предыдущих утверждений относительно ofxreader и unmarshaller?

Пожалуйста, не ругайте меня, я изучаю java с помощью playframework, и я был бы очень признателен за возможность разбора этих файлов ofx.

заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 08 февраля 2010

Я не вижу простого старого учебника, но в каталоге test есть пример кода, иллюстрирующий OFXReader и AggregateUnmarshaller.

Фраза «экземпляр net.sf.ofx4j.io.OFXReader» означает один из известных классов реализации », например NanoXMLOFXReader, который проверен здесь Тест для AggregateUnmarshaller - это здесь .

Архивы API и mail также являются хорошими ресурсами. Похоже, много учреждений участвуют.

2 голосов
/ 09 ноября 2010

Для тех, кто наткнулся на это, как я, когда не смог получить ожидаемые результаты от AggregateUnmarshaller ... Вот пример.

//Using a multipart file, but using a regular file is similar.
public void parse(MultipartFile file) throws IOException {
  //Use ResponseEnvelope to start.
  AggregateUnmarshaller<ResponseEnvelope> unmarshaller = new AggregateUnmarshaller<ResponseEnvelope>(
    ResponseEnvelope.class);

  try {
    ResponseEnvelope envelope = unmarshaller.unmarshal(file.getInputStream());
    //Assume we are just interested in the credit card info.  Make sure to cast.
    CreditCardResponseMessageSet messageSet = (CreditCardResponseMessageSet) envelope
      .getMessageSet(MessageSetType.creditcard);

    List<CreditCardStatementResponseTransaction> responses = messageSet.getStatementResponses();
    for (CreditCardStatementResponseTransaction response : responses) {
      CreditCardStatementResponse message = response.getMessage();
      String currencyCode = message.getCurrencyCode();
      List<Transaction> transactions = message.getTransactionList().getTransactions();
      for (Transaction transaction : transactions) {
        System.out.println(transaction.getName() + " " + transaction.getAmount() + " "
          + currencyCode);
      }
    }
  }
  catch (OFXParseException e) {
    e.printStackTrace();
  }
}
...