如何在 PHP 中解析 OFX(版本 1.0.2)文件?

2024-06-23

我有一个OFX http://www.ofx.net/文件下载自Citibank https://www.citibank.com.co/,该文件的 DTD 定义在http://www.ofx.net/DownloadPage/Files/ofx102spec.zip http://www.ofx.net/DownloadPage/Files/ofx102spec.zip(文件 OFXBANK.DTD),OFX 文件似乎是SGML http://www.w3.org/MarkUp/SGML/有效的。 我正在尝试与文档 http://www.php.net/manual/en/class.domdocument.phpPHP 5.4.13 的版本,但我收到几个警告并且文件未解析。我的代码是:

$file = "source/ACCT_013.OFX";
$dtd = "source/ofx102spec/OFXBANK.DTD";
$doc = new DomDocument();
$doc->loadHTMLFile($file);
$doc->schemaValidate($dtd);
$dom->validateOnParse = true;

OFX 文件开头为:

OFXHEADER:100
DATA:OFXSGML
VERSION:102
SECURITY:NONE
ENCODING:USASCII
CHARSET:1252
COMPRESSION:NONE
OLDFILEUID:NONE
NEWFILEUID:NONE

<OFX>
<SIGNONMSGSRSV1>
<SONRS>
<STATUS>
<CODE>0
<SEVERITY>INFO
</STATUS>
<DTSERVER>20130331073401
<LANGUAGE>SPA
</SONRS>
</SIGNONMSGSRSV1>
<BANKMSGSRSV1>
<STMTTRNRS>
<TRNUID>0
<STATUS>
<CODE>0
<SEVERITY>INFO
</STATUS>
<STMTRS>
<CURDEF>COP
<BANKACCTFROM> ...

我愿意在服务器(Centos)中安装和使用任何程序来从 PHP 进行调用。

PD:这门课http://www.phpclasses.org/package/5778-PHP-Parse-and-extract-financial-records-from-OFX-files.html http://www.phpclasses.org/package/5778-PHP-Parse-and-extract-financial-records-from-OFX-files.html别为我工作。


首先,即使 XML 是 SGML 的子集,有效的 SGML 文件也一定不是格式良好的 XML 文件。 XML 更加严格,并且不使用 SGML 提供的所有功能。

As DOMDocument是基于 XML(而不是 SGML)的,这并不真正兼容。

在该问题旁边,请参阅2.2 开放金融交易头在 Ofexfin1.doc 中它向您解释了

Open Financial Exchange 文件的内容由一组简单的标头组成,后跟该标头定义的内容

并进一步:

最后一个标题后面有一个空行。然后(对于 OFXSGML 类型),SGML 可读数据以 标记开始。

因此,找到第一个空白行并删除所有内容,直到那里。然后通过首先将 SGML 转换为 XML 将 SGML 部分加载到 DOMDocument 中:

$source = fopen('file.ofx', 'r');
if (!$source) {
    throw new Exception('Unable to open OFX file.');
}

// skip headers of OFX file
$headers = array();
$charsets = array(
    1252 => 'WINDOWS-1251',
);
while(!feof($source)) {
    $line = trim(fgets($source));
    if ($line === '') {
        break;
    }
    list($header, $value) = explode(':', $line, 2);
    $headers[$header] = $value;
}

$buffer = '';

// dead-cheap SGML to XML conversion
// see as well http://www.hanselman.com/blog/PostprocessingAutoClosedSGMLTagsWithTheSGMLReader.aspx
while(!feof($source)) {

    $line = trim(fgets($source));
    if ($line === '') continue;

    $line = iconv($charsets[$headers['CHARSET']], 'UTF-8', $line);
    if (substr($line, -1, 1) !== '>') {
        list($tag) = explode('>', $line, 2);
        $line .= '</' . substr($tag, 1) . '>';
    }
    $buffer .= $line ."\n";
}

// use DOMDocument with non-standard recover mode
$doc = new DOMDocument();
$doc->recover = true;
$doc->preserveWhiteSpace = false;
$doc->formatOutput = true;
$save = libxml_use_internal_errors(true);
$doc->loadXML($buffer);
libxml_use_internal_errors($save);

echo $doc->saveXML();

然后,此代码示例输出以下(重新格式化的)XML,其中还显示 DOMDocument 正确加载了数据:

<?xml version="1.0"?>
<OFX>
  <SIGNONMSGSRSV1>
    <SONRS>
      <STATUS>
        <CODE>0</CODE>
        <SEVERITY>INFO</SEVERITY>
      </STATUS>
      <DTSERVER>20130331073401</DTSERVER>
      <LANGUAGE>SPA</LANGUAGE>
    </SONRS>
  </SIGNONMSGSRSV1>
  <BANKMSGSRSV1>
    <STMTTRNRS>
      <TRNUID>0</TRNUID>
      <STATUS>
        <CODE>0</CODE>
        <SEVERITY>INFO</SEVERITY>
      </STATUS>
      <STMTRS><CURDEF>COP</CURDEF><BANKACCTFROM> ...</BANKACCTFROM>
</STMTRS>
    </STMTTRNRS>
  </BANKMSGSRSV1>
</OFX>

我不知道这是否可以根据 DTD 进行验证。也许这有效。此外,如果 SGML 不是使用同一行上的标记值编写的(并且每行上只需要一个元素),那么这种脆弱的转换将会中断。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 PHP 中解析 OFX(版本 1.0.2)文件? 的相关文章

  • 无限滚动启用(wordpress)

    因此 我发现本教程可以启用无限滚动 http wptheming com 2012 03 infinite scroll to wordpress theme http wptheming com 2012 03 infinite scro
  • XMLHttpRequest() 并输出 csv 文件

    我可以通过向新窗口发出 html 表单 POST 并使用 PHP 响应来成功生成 csv 文件 header Content type text csv header Content Disposition attachment filen
  • 基本的php问题。添加 javascript 到 .php 页面

    嗨 我不是 php 开发人员 我以前从未接触过它 但我被要求向网站添加谷歌购物车跟踪代码 当有人完成订单时 将被发送到 finishorder php 当我转到 finishorder php 文件时 它看起来像这样 include dir
  • 使用 laravel 拒绝 .composer/config 文件权限

    我在 ubuntu virtualbox 上有一个 laravel 项目 我曾经跑步composer update一切都很好 我不知道有什么变化可能会影响这一点 但现在当我跑步时composer update I get file get
  • php-fpm 需要在监狱环境中放置哪些系统文件才能在 ubuntu 上正常运行?

    我在 ubuntu 12 04 上使用 php5 fpm 并且为 nginx 托管的每个域都有单独的池和 chroot 位置 不过 我知道有些系统文件需要直接放在jail中 但是我需要哪些呢 我知道 dns 解析当前不起作用 并且我读过一些
  • 使用 R 并行处理 XML 节点

    我正在尝试与 R 并行处理 XML 文档xml2包装和foreach功能 但我收到 node attrs x node nsMap ns 中的错误 外部指针无效 尝试导出树集群导出 示例代码 library xml2 library for
  • 防止我的 PHP 网络爬虫停止运行

    我正在使用 PHPCrawl 类并添加了一些 DOMDocument 和 DOMXpath 代码来从网页中获取特定数据 但是脚本在接近爬行整个网站之前就停止了 我已将 set time limit 设置为 100000000 因此这不应该成
  • 如何在 Windows 上以纯 PHP 形式提取 .tar 文件?

    我有一个 PHP 脚本 我想在 Windows 上运行 我需要提取 tar 文件 如何提取 tar 文件 我知道 PharData 类 它可以在 Linux 上运行 但不能在 Windows 上运行 我的脚本就死了 没有错误输出或任何东西
  • 如何在 Linux 上的 php 中启用 --enable-soap?

    这就是问题所在 我在 Apache 上安装了 PHP 5 2 9 但无法升级 PHP 有没有办法在 PHP 5 2 9 中启用 SOAP PHP 手册中说 要启用 SOAP 支持 请使用 enable soap 配置 PHP 这根本没有帮助
  • date() 和 strtotime 的问题

    这是我所拥有的 str 12 25 2009 echo date Y m d strtotime str 这会产生 1969 12 31 而不是 2009 12 25 如果我将 str var 设置为 01 01 2009 我将得到正确的
  • 将我的 JSON 字符串格式化为 PHP 中的
      有序列表

    我正在为一个宠物项目开发一个简单的 CMS 我目前有一个 JSON 字符串 其中包含菜单结构的页面 ID 和父页面 ID 的列表 我现在想将此字符串转换为嵌套或分层列表 有序列表 我尝试过循环查找 但似乎最终得到了过于复杂的子类范围 我正在
  • 从套接字读取数据,发送响应并关闭

    我正在开发一个 c 和 php 项目 其中 PHP 脚本打开一个到 c 程序的套接字 c 程序将读取数据 然后发回响应 在 PHP 脚本中我有以下内容 echo Opening Client fp fsockopen 127 0 0 1 1
  • PHP:注意:定义会话变量的索引未定义

    我正在制作一个带有电子邮件验证器的注册系统 您典型的 使用此代码来验证 类型的事情 我希望存储一个会话变量 以便当人们在注册页面上完成帐户注册并意外导航回该页面时 它会提醒他们需要在使用前激活帐户 使这个问题如此难以诊断的原因是我以类似的方
  • 在 Woocommerce 结帐页面上移动亚马逊按钮

    我需要移动 Woocommerce 结账页面上的 Amazon Pay 消息 按钮 我们正在使用Woocommerce 的亚马逊支付 https woocommerce com products pay with amazon 当我查看插件
  • 一系列 unicode 点的正则表达式 PHP

    我正在尝试从字符串中删除所有字符 除了 字母数字字符 美元符号 下划线 代码点之间的 Unicode 字符U 0080 and U FFFF 通过这样做 我得到了前三个条件 preg replace a zA Z d foo 我如何去满足第
  • Java XPath API - 获取表示子树的字符串

    我的问题不是关于 xpath 语法 而是与 xpath 周围的 java API 有关 考虑以下 xml
  • 是否可以倒回 PDO 结果?

    我正在尝试为 PDO 语句的结果编写一个迭代器 但找不到任何回退到第一行的方法 我想避免调用 fetchAll 和存储所有结果数据的开销 first loop works fine foreach statement as result d
  • Laravel 5 中的两个登录表单

    我一直想知道如何在 laravel 5 中制作两个登录表单一段时间 原因是因为我有一个多站点项目 我在一个项目中拥有管理站点和公共站点 我对路由进行了分组 以便管理路由回答一个域 公共路由回答另一个域 如下所示 Route group ar
  • 拆分 Apache Camel 后恢复标头值

    我有一个 xml 其中使用 split 标签在 Spring DSL 中进行处理 我所做的基本上是在 xml 中搜索一个值 当我找到这个值时 我需要获取另一个标签的值 同一元素的子元素 并将其保存到标头 这个操作看起来很简单 但我无法在拆分
  • simplexml,返回具有相同标签的多个项目

    我将以下 XML 文件加载到 php simplexml 中

随机推荐

  • OAuth2 - 无需用户交互即可授权

    因此 我尝试通过外部应用程序的 API 访问我自己的数据 我只需要访问我自己的数据 不尝试从我的任何用户帐户接收数据 因此他们不需要授权任何内容 显然我需要避免任何重定向 随着我对 OAuth 的研究越多 这似乎是标准流程 该过程被击中 a
  • remove() 不删除调整大小的图像

    jQuery 关于 remove 方法的说明 当你想删除时使用 remove 元素本身以及其中的所有内容 此外 元素本身 所有绑定事件和关联的 jQuery 数据 随着元素被删除 但是 如果您删除 已调整大小的图像周围的 ui 包装器 则情
  • 从 Android 中的 Thread 更新 UI

    我想从更新进度条的线程更新我的用户界面 不幸的是 当从 可运行 更新进度条的可绘制对象时 进度条消失了 更改进度条的可绘制部分onCreate 另一边有效 有什么建议么 public void onCreate Bundle savedIn
  • 如何检查 CLLocationCooperative2D 不为空?

    如何检查 CLLocationCooperative2D 不为空 这是一个非常古老的话题 但我现在需要它 我在 Klaas Hermanns 的帮助下解决了我的问题 做了一点小小的改变 代替 if myCoordinate kCLLocat
  • MySQL 复制 - 连接到主服务器时出错

    我正在尝试在 MySQL 中设置复制 但收到一个错误 我不知道如何修复 ERROR 1218 08S01 连接到主服务器时出错 不允许主机 sh047 mydomain com 连接到此 MySQL 服务器 我已将以下代码添加到 maste
  • 在 setup.py 中声明我的包的可选组件

    我已经建立了一个具有以下结构的库 filters init py core init py base py complex py number py string py extra init py django py iso py filt
  • Laravel 4:处理种子中的关系

    L4 的新种子功能中是否有一种简单的方法来管理多对多关系 一种方法是为数据透视表制作种子 但我需要做很多工作 对于此类事情的良好工作流程有什么想法吗 在最新版本的 Laravel 4 中 您可以在 DatabaseSeeder 类的 run
  • SublimeREPL 无法找到 R

    好吧 这让我发疯 我之前已经设置过 删除了 Sublime Text 现在我不记得正确的配置是什么 非常简单 我通过 SublimeREPL 运行 R 并且需要将 REPL 指向安装 R 的位置 我按照以下指示进行操作http sublim
  • 非成员运算符重载应该放在哪里?

    我想要超载operator lt lt 为了我的班级 我应该将这个重载定义添加到std命名空间 自从ostream operator lt lt 是的一部分std命名空间 或者我应该将其保留在全局命名空间中 简而言之 class MyCla
  • 为什么即使是非常简单的应用程序,MonoTouch 也会导致大量内存泄漏(根据 Instruments 的报告)?

    我正在使用 Instruments 运行一个非常基本的测试应用程序 它发现了很多内存泄漏 因为我知道 Apple 人员在将应用程序提交到 iTunes 时会检查内存泄漏 所以我想调查一下这个问题 我的环境 Mac OS X 10 6 6 上
  • svn 切换错误 - 不是同一个存储库

    我最近移动了 SVN 服务器 现在我正在尝试将工作副本从我的计算机重新定位到新服务器 但我得到了最奇怪的错误 我愿意 svn switch http 99 99 99 new svn company project trunk web 但我
  • 在标签上运行管道时如何获取分支名称?

    我从标签运行管道 比方说v1 0 0 在一个分支上 比方说staging 我的输出文件是用创建的 CI PROJECT NAME CI COMMIT REF NAME apk 结果是一个名为MyProject v1 0 0 apk 我希望在
  • 从 .gitlab-ci.yml 中的 JSON 中提取徽章 ID

    我有一个示例项目 https gitlab com mstein badge number example repo在 gitlab 中 我想获取最后一个徽章的 ID gitlab ci yml通过脚本 我了解所有徽章的概览作为 json
  • 如何避免 Google App Engine 标准环境中 Gorilla 会话的内存泄漏?

    我正在使用 Gorilla 在 Google App Engine 上启用会话变量 到目前为止 我只导入了 github com gorilla sessions 但 Gorilla 的页面显示 如果您不使用 gorilla mux 则需要
  • 将 Dynamo DB 流数据解组为 Json 格式

    我必须将DDB流消息转换为正常的json类型 为此我正在使用 unmarshalleddata aws DynamoDB Converter unmarshall result NewImage 其中 result NewImage 是 c
  • 如何在 Angular js 中创建动态工厂?

    在我的项目中 我必须在 Angular js 中创建动态工厂 其动态工厂名称如下 function createDynamicFactory modId return myModule factory modId existingServi
  • 从对象数组中删除重复项

    我有一堂课叫Customer它有几个字符串属性 例如 firstName lastName email etc 我从a读取客户信息csv创建类数组的文件 Customer customers 我需要删除具有相同电子邮件地址的重复客户 为每个
  • GUID 幕后花絮

    我想知道 GUID 的创建过程是怎样的 我的意思不是用什么来以特定语言创建 GUID SQL Server 中的 NewID C 中的 Guid NewGuid 我的意思是当你调用这些方法 函数时 它们会做什么来使图形用户界面 Also R
  • 如何在 Python 中打印异常?

    如何打印错误 异常except block try except print exception 对于 Python 2 6 及更高版本和 Python 3 x except Exception as e print e 对于 Python
  • 如何在 PHP 中解析 OFX(版本 1.0.2)文件?

    我有一个OFX http www ofx net 文件下载自Citibank https www citibank com co 该文件的 DTD 定义在http www ofx net DownloadPage Files ofx102s