繁体   English   中英

PHP DocDocument,在saveXML()函数中通过“

[英]PHP DocDocument, in saveXML() function change " by "

我尝试使用DOMDocument库,但是我需要原始XML文本而不作进一步更改,因为它是带有数字证书(XMLSecurityKey openssl)的签名xml。

简单步骤loadxml和savexml更改原始文本。

我的代码是:

$PROCESSED_TEXT = "<node><child>product &amp; &apos; &gt; &lt; &quot;</child></node>";

$obj = new DOMDocument();  
$obj->formatOutput = false; // (needed)
$obj->preserveWhiteSpace = true; // (needed)
$obj->encoding = 'ISO-8859-1'; // (needed)

$obj->loadXML($PROCESSED_TEXT);

$strXMLFinal = $obj->saveXML();

echo $strXMLFinal;

OUTPUT:

<node><child>producto &amp; ' &gt; &lt; "</child></node>

我需要一样的东西:

<node><child>product &amp; &apos; &gt; &lt; &quot;</child></node>

我尝试使用以下方法均未成功:

$obj->xmlStandalone = true;
$obj->substituteEntities = false;
$obj->resolveExternals = false;
$obj->strictErrorChecking = false;

任何想法?

就DOM而言,您的输入和输出完全相同。 您签名的输入内容包含&apos; &quot; 表示使用的签名过程不正确。 在签名之前,应该对XML进行规范化 ,因为可能存在许多同等有效的序列化,否则会破坏XML签名。


W3C Canonical XML建议书,第2.3节

文本节点-字符串值,但所有&amp;除外,均用&amp;代替&amp; ,所有开括号(<)均替换为&lt; ,所有的右尖括号(>)替换为&gt; ,并且所有#xD字符均替换为&#xD;


具体省略的是'"表示为&apos;&quot;

规范化XML的唯一位置是&quot; 在属性值之内,并且在任何地方都找不到&apos;

还要注意的是,而不是$obj->saveXML()你可以用$obj->C14N()以确保您的输出是规范形式,因此将匹配适当的符号输入。


如果您无法收到正确的输入,则唯一的选择是在序列化后处理XML字符串。 确切的操作方法-是否进行预处理以标记特殊字符并进行后期处理以替换特殊字符; 或用原始输入字符串批量替换部分输出-首先取决于您对所有这些的处理方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM