将多个 XML 节点的数据混合到一个 PHP 变量中

发布于 2024-11-07 20:21:20 字数 271 浏览 5 评论 0原文

我试图找出如何使用 SimpleXML 将此 XML 文件的 FIPS 部分合并到一个 php 变量中。

我尝试使用的示例 xml 文件位于 http://codepad.org/MQeR2VBZ

基本上我想要一个其中包含“001033,001077”的变量(不带引号)

我是 PHP 新手,这是我第一次使用 stackoverflow,所以如果我充满失败,请原谅我

I am trying to find out how to merge the FIPS part of this XML file into one php variable with SimpleXML.

a sample xml file I'm trying to use is at http://codepad.org/MQeR2VBZ

basically i want a variable with "001033,001077" in it (without the quotes"

I'm new to PHP and this is my first time using stackoverflow so please forgive me if I'm full of fail

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

格子衫的從容 2024-11-14 20:21:20

您可以使用 XPath 轻松解决此问题。

XPath 允许您以几乎任何可能的组合查询文档中的节点。要查询前面带有内容 FIPS6 的 valueName 元素的地理编码值,您可以使用此查询:

/alert/info/area/geocode/value[preceding-sibling::valueName = "FIPS6"]

但是,文档有一个默认的命名空间 用于警报元素(如 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"

You can solve this easily with XPath.

XPath lets you query for nodes in the document in almost any possible combination. To query for the geocode value that is preceded by a valueName element with the content FIPS6, you can use this query:

/alert/info/area/geocode/value[preceding-sibling::valueName = "FIPS6"]

However, the document has a default namespace for the alert element (as indicated by the xmlns attribute). By default, SimpleXml will not be able to access any namespaced nodes in the document via XPath until we tell it the namespace via registerXPathNamespace and prefix any elements in the query with an arbitrary prefix.

The result of the XPath will be an array containing SimpleXmlElements. When you cast a SimpleXmlElement to string (or use it in a string context), it will return it's nodeValue, which is the values you actually want to combine, so you can simply call implode on the resulting array to combine the values into a string.

Code (demo)

$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"
2024-11-14 20:21:20

这应该让您开始走上正确的道路:

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

This should get you started on the right path:

$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 );
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文