我正在尝试找出如何使用 SimpleXML 将此 XML 文件的 FIPS 部分合并到一个 php 变量中。
我正在尝试使用的示例 xml 文件位于http://codepad.org/MQeR2VBZ
基本上我想要一个带有“001033,001077”的变量(不带引号)
我是 PHP 新手,这是我第一次使用 stackoverflow,所以如果我失败了,请原谅我
我正在尝试找出如何使用 SimpleXML 将此 XML 文件的 FIPS 部分合并到一个 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 );