質問

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

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

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

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

ありがとう!

役に立ちましたか?

解決

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

より具体的に言うと、 xmlns="" 問題の原因となっているルート ノードの属性。これは、名前空間を登録してから、 Q名前 その後は要素を参照します。

$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/...");

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

他のヒント

私は上記の答えは役に立つことがわかったが、それはかなり私のために動作しませんでした。 これは良く働くことになった。

// 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);

次のPHPコードが自動的に別名「デフォルト」の下の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';

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

$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を取り除きます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top