【问题标题】:VBA access DB posting XML to php server changes & to ["amp_VBA 访问 DB 将 XML 发布到 php 服务器更改 & 到 ["amp_
【发布时间】:2019-04-05 06:09:18
【问题描述】:

当正文包含 & 时,我在读取从 access 数据库发送的 php 中的 XML 时遇到问题。当我收到正文中包含 & 的内容时,似乎 & 在进程中的某处转换为 ["amp; 并且整个 xml 格式错误。这是我发送和接收的示例:

xml = "<?xml version='1.0' encoding='utf-8'?><query><author>John Steinbeck</author></query>"

Dim objHTTP As New ServerXMLHTTP60
objHTTP.Open "POST", "http://localhost/sandpit/testxml.php", False      
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"      
objHTTP.send "request=" & xml

php文件只是一个简单的echo请求,用于测试:

<?php echo "<xmp>posted: ";var_dump($_REQUEST);echo "</xmp>"; ?>

当作者正文不包含 & 时,PHP 中的结果是:

["request"]=>
    string(84) "<?xml version='1.0' encoding='utf-8'?><query><author>John 
    Steinbeck</author></query>"
    }

但是,如果我将 xml 字符串更改为:

xml = "<?xml version='1.0' encoding='utf-8'?><query><author>John &amp; Steinbeck</author></query>"

我得到的结果是:

posted: array(2) {
    ["request"]=>
    string(41) "<?xml version='1.0'?><query><author>John "
    ["amp;_Steinbeck</author></query>"]=>
    string(0) ""
}

你可以在上面看到 & 被转换为 ['amp....

还尝试使用 CDATA,结果如下:

posted: array(2) {
    ["request"]=>
    string(68) "<?xml version='1.0' encoding='utf-8'?><query><author><! 
    [CDATA[ John "
    ["Steinbeck]]></author></query>"]=>
    string(0) ""

}

似乎在 xml 字符串末尾的 & 号之后的所有内容都包含在 ["..."] 中,这会弄乱 xml。

还尝试将内容类型更改为 text/xml 和 application/xml 在这种情况下我得到一个空字符串。

我已经测试了在 php 中使用 CURL 发送相同的 xml,并且使用内容类型 text/xml 甚至 text/html 都可以正常工作。

有人知道问题出在哪里吗?

【问题讨论】:

  • CDATA,没用?这似乎很奇怪。你用什么解析 XML?我过去使用XMLReader 取得了巨大成功。对于 DOM 或 SimpleXml 之类的东西,我从来没有运气好过。我唯一遇到 & 的真正问题是在 Quickbooks 使用 XML 时,但那是很久以前的事了,也许是 8 年前。我希望他们现在能解决这个问题。
  • @Nick 是的,我看过那篇文章并尝试过,但是任何带有 & 符号的东西都会受到影响
  • @ArtisticPhoenix 我正在使用 simplexml,但问题是 XML 在到达时格式不正确,所以 simplexml 只是将其视为无效。
  • @ErikvonAsmuth 我撤回了我的近距离投票。

标签: php xml ms-access vba ampersand


【解决方案1】:

您以application/x-www-form-urlencoded 的身份提交您的数据,而没有对您的内容进行 url 编码。

在 url 编码数据中,&amp; 分隔两个参数,因此 PHP 正确地解释了具有指定编码的数据,您只是编码错误。这不是 XML 问题,而是 URL 编码问题。

在 url 编码中,可以使用 %26 代替 & 号来转义 & 号。

VBA 不附带 URL 编码器。使用不同的编码方案,编写自己的编码方案,或使用this answer 中提供的编码方案

【讨论】:

  • 感谢 Erik,我意识到这不是 XML 的问题,而是标题的问题,我不想对 xml 进行编码,所以我实现了使用 php://input 的解决方法。但是,是的,使用 %26 进行编码可能会奏效。
【解决方案2】:

我在这篇文章中找到了解决方法和合理的解释:

PHP "php://input" vs $_POST

我怀疑标题中的内容类型可能是导致这篇文章的问题,因此您需要获取原始输入,而不是使用 $_POST 或 $_REQUEST 来获取输入,例如 $xml = file_get_contents('php ://input');

我正在使用 Symfony 请求,因此可以使用 $request->getContent() 获取原始内容。

当您使用 text/xml 的内容类型时,它应该像在 php 中一样工作,但似乎 PHP 超全局变量过滤掉了这就是为什么我得到一个空字符串,但仍然可以使用 php 读取原始输入: //输入。

【讨论】:

    猜你喜欢
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多