Php 在此情况下,建议使用名称空间解析无效xml响应的正确方法

Php 在此情况下,建议使用名称空间解析无效xml响应的正确方法,php,xml,xml-parsing,xml-namespaces,Php,Xml,Xml Parsing,Xml Namespaces,我正在使用php解析API的xml响应。以下是一个示例响应- 在iframe src中检查具有有效标记和单个参数的工作代码 我现在在想什么 现在,按照@hakre在我的- 我试过使用DOMDocument::loadHTML,但正如我预期的那样失败了。给出如下警告:警告:DOMDocument::loadHTML:标记q:响应在实体中无效,第2行 为中列出的字符转义字符串的特定部分 问题: 最后,在我的例子中,如果我必须转义字符串的某个特定部分,那么我为什么不首先查找这些分隔符并返回它们呢?那么

我正在使用php解析API的xml响应。以下是一个示例响应-

在iframe src中检查具有有效标记和单个参数的工作代码

我现在在想什么

现在,按照@hakre在我的-

我试过使用DOMDocument::loadHTML,但正如我预期的那样失败了。给出如下警告:警告:DOMDocument::loadHTML:标记q:响应在实体中无效,第2行

为中列出的字符转义字符串的特定部分

问题:

最后,在我的例子中,如果我必须转义字符串的某个特定部分,那么我为什么不首先查找这些分隔符并返回它们呢?那么在这种情况下使用DOMDocument::loadXML有什么好处呢?我想这是一个很常见的情况


因此,我的问题是这个要求以及注释下面的要点-,最聪明的方法是什么?

在实施标准时,可以做出许多有效的选择。但是,在违反标准时没有有效的选择。您需要向发送这些数据的人展示他们在实现XML标准时的一些有效选择

其中一个选择是将HTML内容放在CDATA中。另一种方法是对HTML进行编码

他们向您发送垃圾并称之为XML是完全不可接受的。也许他们没有意识到它不是有效的XML,但事实并非如此。如果他们不相信您,那么您应该简单地尝试在标准XML编辑器(如XMLspy)中打开XML。让他们求助于XMLspy作为第三方,它可以告诉他们自己的XML是否有效

然后,他们可以自由选择如何生成有效的XML,您需要处理他们的选择

$xml = '<?xml version="1.0"?>
                    <q:response xmlns:q="http://api-url">
                        <q:impression>
                            <q:content>
                                <html>
                                        <meta name="HandheldFriendly" content="True">
                                        <meta name="viewport" content="width=device-width, user-scalable=no">
                                        <meta http-equiv="cleartype" content="on">
                                    </head>
                                    <body style="margin:0px;padding:0px;">
                                        <iframe scrolling="no" src="http://api-response-url/with/lots?of=parameters&somethingmore=someval" width="320px" height="50px" style="border:none;"></iframe>
                                    </body>
                                </html>
                            </q:content>
                            <q:cpc>0.02</q:cpc>
                        </q:impression>
                    </q:response>';
$dom = new DOMDocument;

$dom->loadXML($xml); // load the XML string defined above - works only if entire xml is valid 

$adHtml = "";

foreach ($dom->getElementsByTagNameNS('http://api-url', '*') as $element) 
{
    if($element->localName == "content")
    {
         $children = $element->childNodes; 

         foreach ($children as $child) 
         {
              $adHtml .= $child->ownerDocument->saveXML($child); 
         }

    }

}

echo $adHtml; //Have got necessary contents here