2

我通过 API 接收 XML 文件并使用 PHP/SimpleXML/XPath 对其进行解析。

我需要从包含 HTML 的字段之一获取数据并将其输出,但是 HTML 都以“h:”命名空间为前缀。

示例 XML:

<xmlfeed>
 <title>Title Here</title>
  <a:content xmlns:a="http://www.w3.org/2005/Atom" xmlns:h="http://www.w3.org/1999/xhtml">   
    <h:table xmlns:h="http://www.w3.org/1999/xhtml" width="1360" height="259" cellspacing="0" cellpadding="0" border="0">
     <h:tbody><h:tr><h:td width="35%" colspan="3"></h:td></h:tr></h:tbody>
    </h:table>
  <h:h3 xmlns:h="http://www.w3.org/1999/xhtml">Test heading here</h:h3>
  <h:a href="link.php">Link Here</h:a>
 </a:content>
</xmlfeed>

如何解析 a:content 中的所有 HTML 以从每个元素以及命名空间中删除“h:”前缀?

谢谢你。

4

2 回答 2

0

我不精通 PHP 或 simpleXML,但由于没有其他人回答,我会尝试一下。(我确实很了解 XML 和 XPath。)

输入中元素的子<a:content>元素是 XHTML 元素。大多数浏览器都可以识别 XHTML。它是 XHTML 名称空间中的一个 XML 词汇表,在其他方面非常接近 HTML。

所以我认为你不需要删除任何命名空间。相反,选择 的孩子<a:content>,使用

$xml->xpath('//a:content/node()')

并输出每一个。(听起来您需要对每一个进行序列化,而不仅仅是回显它们的值。)

请注意,为了使上述 XPath 表达式起作用,您首先需要注册a名称空间前缀(请参阅registerXPathNamespace和那里的示例)。

希望这能让你走得更远。如果您还有其他问题,请告诉我。

于 2012-12-14T14:29:34.537 回答
0

我一定在文档中忽略了这一点。

花了一点时间才找到,但以下似乎效果很好:

$content = $xpath->query('a:content/h:*', $context);
foreach ($content as $piece)
{
    $piece->removeAttributeNS('http://www.w3.org/1999/xhtml', 'h');
    $html_content .= $dom->saveXML($piece);
}

希望这有助于其他人试图解决同样的问题。

于 2012-12-18T22:59:17.070 回答