このXMLファイルのFIPS部分をSimpleXMLを使用して1つのphp変数にマージする方法を見つけようとしています。
私が使用しようとしているサンプルxmlファイルはhttp://codepad.org/MQeR2VBZにあります
基本的に、「001033,001077」を含む変数(引用符なし)が必要です。
私はPHPを初めて使用し、stackoverflowを使用するのはこれが初めてなので、失敗に満ちている場合はご容赦ください
このXMLファイルのFIPS部分をSimpleXMLを使用して1つのphp変数にマージする方法を見つけようとしています。
私が使用しようとしているサンプルxmlファイルはhttp://codepad.org/MQeR2VBZにあります
基本的に、「001033,001077」を含む変数(引用符なし)が必要です。
私はPHPを初めて使用し、stackoverflowを使用するのはこれが初めてなので、失敗に満ちている場合はご容赦ください
これはXPathを使用して簡単に解決できます。
XPathを使用すると、ドキュメント内のノードをほぼすべての可能な組み合わせでクエリできます。コンテンツがFIPS6のvalueName要素が前にあるジオコード値をクエリするには、次のクエリを使用できます。
/alert/info/area/geocode/value[preceding-sibling::valueName = "FIPS6"]
ただし、ドキュメントには、alert要素のデフォルトの名前空間があります(xmlns属性で示されます)。デフォルトでは、SimpleXmlは、XPathを介してドキュメント内の名前空間ノードにアクセスできません。これは、名前空間を介して通知registerXPathNamespace
し、クエリ内の要素に任意のプレフィックスを付けるまでです。
XPathの結果は、SimpleXmlElementsを含む配列になります。SimpleXmlElementを文字列にキャストすると(または文字列コンテキストで使用すると)、実際に結合する値であるnodeValueが返されるためimplode
、結果の配列を呼び出して値を文字列に結合できます。
$alert = simplexml_load_file('http://…');
$alert->registerXPathNamespace('a', 'urn:oasis:names:tc:emergency:cap:1.1');
$fipsValues = implode(',', $alert->xpath(
'/a:alert/a:info/a:area/a:geocode/a:value[
preceding-sibling::a:valueName = "FIPS6"
]'
));
print_r($fipsValues); // will contain "001033,001077"
これにより、正しい道を歩み始めることができます。
$string = <<<XML
<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<?xml-stylesheet href='http://alerts.weather.gov/cap/capatomproduct.xsl' type='text/xsl'?>
<alert xmlns='urn:oasis:names:tc:emergency:cap:1.1'>
....
[rest of xml here]
....
</alert>
XML;
$xml = simplexml_load_string( $string );
$fips6 = array();
foreach( $xml->info->area->geocode AS $element ) {
if( $element->valueName == 'FIPS6' ) {
$fips6[] = $element->value;
}
}
$value = implode( "," $fips6 );