1

一个持续了一年多的问题,我虽然已经纠正了,但已经演变成一个怪物。

我使用在 PHP 系统上生成的 XML 在站点之间移动大量数据。主要是文本 我遇到了一些破坏传输的基本 XML 项,因此我使用了所有 XML 值的这段代码。

$value=str_replace("'","'",$value);
print '<'.$key.'>';
print htmlspecialchars($value, ENT_XML1 | ENT_QUOTES, 'UTF-8');
print '</'.$key.'>'; 

$key 是字段,这对所有数据都非常有效,除了包含诸如 piñata 之类的重音的任何数据。带有 ñ 字符的值显示为完全空。

我还没有找到一个函数来使用 PHP 清理 XML 格式的文本。我目前将数据库中的数据转储为这种格式,然后在接收端加载到 SIMpleXML 以加载回数据库。

通过清理所有数据或可能的 json 编码而不是 XML 的解决方案可能会很棒。

谢谢-克里斯

4

2 回答 2

0

对于我的实例,即使我所有的表都设置为 UTF-8,在构造我的 XML 时,我必须将值设置为 UTF-8

$value=str_replace("'","&#039;",$value);
print '<'.$key.'>';
$value = utf8_encode($value);
print htmlspecialchars($value, ENT_XML1 | ENT_QUOTES, 'UTF-8');
print '</'.$key.'>'; 

不确定在从表读取和放置之间何时更改编码,但这产生了我需要的结果。我不认为带有特殊字符的 BASE64 是可行的。

于 2018-01-13T18:36:56.640 回答
0

如果您使用 XML Api(DOM、XMLReader),它将处理值/文本内容的编码问题。但是标签名称是一个不同的问题。您必须创建一个规范化的标签名称或使用一个固定的标签名称。然后将原始字段名称存储为属性值。

例如使用固定标签名称field

<records>
  <record>
    <field name="some field">some content</field>
  </record>
</records>

这是更简洁的变体,因为这里没有动态标记名称,您可以创建 Schema/DTD 并验证 XML。

或字段名称的规范化版本:

<records>
  <record>
    <some-field>some content</some-field>
  </record>
</records>

这通常用作将数据结构序列化为 XML 的通用方式。它只是格式良好的 XML,您不能定义 Schema/XSD,因为标签名称取决于数据。

于 2018-01-13T19:01:12.930 回答