阻止 Symfony XMLEncoder 将 CDATA 添加到有效负载

Prevent Symfony XMLEncoder from adding CDATA to payload

提问人:RonnyKnoxville 提问时间:10/4/2022 更新时间:10/4/2022 访问量:324

问:

我有一个独特的情况,如果有任何XML专家阅读本文,我希望得到一些帮助。

我需要在XML请求中插入一个HTML转义的XML有效负载(我的上帝,不要问!我遇到的问题是Symfony XML编码器想要添加到我的节点,因为它们在有效负载被转义时包含“&”字符。CDATAxmlRequest

    $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[&lt;Foo&gt;&lt;value&gt;Bar&lt;/value&gt;]]></xmlRequest></Login></soap12:Body></soap12:Envelope>

我需要插入它而不插入.所以它看起来像这样:$requestDataCDATA

<?xml version="1.0" encoding="UTF-8"?>
<soap12:Envelope xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"><soap12:Body><xmlRequest><!&lt;Foo&gt;&lt;value&gt;Bar&lt;/value&gt;></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 编码后插入数据的分支,因为就我所尝试的而言,我没有办法欺骗这个库不插入那个。CDATAhtmlspecialchars&CDATACDATA

php xml symfony xml-解析 xmlencoder

评论

0赞 Jim 10/4/2022
它显然是为通用目的而制作的,并且该函数是硬编码的,因此如果有任何与号,它会添加一个 CDATA。虽然从技术上讲,除非在 CDATA 标记中,否则单个 & 符号是无效的 XML,而没有转义字符序列是有效的。只需使用另一个库,例如 或 .DOMDocumentSimpleXML
0赞 RonnyKnoxville 10/4/2022
这就是我现在最终要做的事情。感谢您确认我对此的看法。我的计划是扩展库以使 CDATA 可切换,但这需要分叉库,所以它确实如此。SimpleXML

答: 暂无答案