20

次のような XML ドキュメントがあります。

<Data 
  xmlns="http://www.domain.com/schema/data" 
  xmlns:dmd="http://www.domain.com/schema/data-metadata"
>
  <Something>...</Something>
</Data>

PHP で SimpleXML を使用して情報を解析しています。私は配列を扱っていますが、名前空間に問題があるようです。

私の質問は、これらの名前空間を削除するにはどうすればよいですか? XML ファイルからデータを読み取ります。

ありがとうございました!

4

5 に答える 5

20

XPathを使用している場合、これはXPathの制限であり、PHPではありません。詳細については、 xpathとデフォルトの名前空間に関するこの説明を参照してください。

より具体的にxmlns=""は、問題を引き起こしているルートノードの属性です。つまり、名前空間を登録し、その後QNameを使用して要素を参照する必要があります。

$feed = simplexml_load_file('http://www.sitepoint.com/recent.rdf');
$feed->registerXPathNamespace("a", "http://www.domain.com/schema/data");
$result = $feed->xpath("a:Data/a:Something/...");

重要registerXPathNamespace呼び出しで使用されるURIは、実際のXMLファイルで使用されるURIと同一である必要があります。

于 2009-08-07T17:31:39.430 に答える
17

上記の答えは役に立ちましたが、うまくいきませんでした。これは最終的にはうまく機能しました:

// Gets rid of all namespace definitions 
$xml_string = preg_replace('/xmlns[^=]*="[^"]*"/i', '', $xml_string);

// Gets rid of all namespace references
$xml_string = preg_replace('/[a-zA-Z]+:([a-zA-Z]+[=>])/', '$1', $xml_string);
于 2011-10-03T23:03:48.267 に答える
2

次の PHP コードは、エイリアス "default" の下の XML ファイルで指定されたデフォルトの名前空間を自動的に検出します。プレフィックスを含めるためにすべての xpath クエリを更新する必要はありません default:

したがって、デフォルトの NS 定義が含まれているか含まれていない XML ファイルを読み取り、すべてのSomething要素をクエリする場合は、次のコードを使用できます。

$xml = simplexml_load_file($name);
$namespaces = $xml->getDocNamespaces();
if (isset($namespaces[''])) {
    $defaultNamespaceUrl = $namespaces[''];
    $xml->registerXPathNamespace('default', $defaultNamespaceUrl);
    $nsprefix = 'default:';
} else {
    $nsprefix = '';
}

$somethings = $xml->xpath('//'.$nsprefix.'Something');

echo count($somethings).' times found';
于 2012-10-30T15:45:01.890 に答える
0

名前空間を完全に削除するには、正規表現 (RegEx) を使用する必要があります。例えば:

$feed = file_get_contents("http://www.sitepoint.com/recent.rdf");
$feed = preg_replace("/<.*(xmlns *= *[\"'].[^\"']*[\"']).[^>]*>/i", "", $feed); // This removes ALL default namespaces.
$xml_feed = simplexml_load_string($feed);

次に、XML をロードする前にすべての xml 名前空間を削除しました (次のようなフィールドがある場合は、正規表現に注意してください:

<![CDATA[ <Transfer xmlns="http://redeux.example.com">cool.</Transfer> ]]>

次に、予期しない結果につながる可能性がある CDATA 内から xmlns を取り除きます。

于 2009-08-07T17:48:55.853 に答える