提问人:RonnyKnoxville 提问时间:10/4/2022 更新时间:10/4/2022 访问量:324
阻止 Symfony XMLEncoder 将 CDATA 添加到有效负载
Prevent Symfony XMLEncoder from adding CDATA to payload
问:
我有一个独特的情况,如果有任何XML专家阅读本文,我希望得到一些帮助。
我需要在XML请求中插入一个HTML转义的XML有效负载(我的上帝,不要问!我遇到的问题是Symfony XML编码器想要添加到我的节点,因为它们在有效负载被转义时包含“&”字符。CDATA
xmlRequest
$requestData = ["Foo" => "Bar"];
$xmlArray = [
"@xmlns:soap12" => "http://www.w3.org/2003/05/soap-envelope",
"soap12:Body" => [
"Login" => [
"@xmlns" => "http://www.ahsl.com/",
"xmlRequest" => htmlspecialchars($requestData),
]
]
];
$encoders = [new XmlEncoder()];
$serializer = new Serializer([], $encoders);
return $serializer->serialize(
$xmlArray,
XmlEncoder::ROOT_NODE_NAME => "soap12:Envelope"
XmlEncoder::FORMAT
);
产生(我不得不删掉敏感信息,所以这可能并不完美,它只是一个例子):
<?xml version="1.0" encoding="UTF-8"?>
<soap12:Envelope xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"><soap12:Body><xmlRequest><![CDATA[<Foo><value>Bar</value>]]></xmlRequest></Login></soap12:Body></soap12:Envelope>
我需要插入它而不插入.所以它看起来像这样:$requestData
CDATA
<?xml version="1.0" encoding="UTF-8"?>
<soap12:Envelope xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"><soap12:Body><xmlRequest><!<Foo><value>Bar</value>></xmlRequest></Login></soap12:Body></soap12:Envelope>
这个问题部分是错误,部分是图书馆说“我们没想到有人会做这种疯狂的事情”。
在 XMLEncoder 库中,有以下块:
/**
* Checks if a value contains any characters which would require CDATA wrapping.
*/
private function needsCdataWrapping(string $val): bool
{
return preg_match('/[<>&]/', $val);
}
库认为它需要添加,因为它是注入一个,所以它认为它需要添加,因为它看到了 XML,而实际上它不是。我想知道是否有其他人找到了一个技巧来解决这个问题,或者可能有一个不同的流程,或者我可以用来在 XMLEncoder 编码后插入数据的分支,因为就我所尝试的而言,我没有办法欺骗这个库不插入那个。CDATA
htmlspecialchars
&
CDATA
CDATA
答: 暂无答案
评论
DOMDocument
SimpleXML
SimpleXML