2

API経由でXMLファイルを受け取り、PHP/SimpleXML/XPathで解析しています。

HTML を含むフィールドの 1 つからデータを取得して出力する必要がありますが、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

ドキュメントでこれについて説明したに違いありません。

見つけるのに少し時間がかかりましたが、以下はうまくいくようです:

$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 に答える
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 に答える