【问题标题】:Load Foreach loop into string as XML将 Foreach 循环作为 XML 加载到字符串中
【发布时间】:2021-02-14 04:20:03
【问题描述】:

我正在尝试将 foreach 加载到格式为 XML 的字符串中。

我试过如下

  <?php
  $data = '<?xml version="1.0" encoding="utf-8" ?><markers>';
  foreach ($entries as $entry => $marker ) {
    '<marker name="' . $marker->getName() . '"'.'lat="' . $marker->getLatitude() . '"'.'lng="' . $marker->getLongitude() . '"'.'address="' . $marker->getAddressLineOne() . '"'.'address2="' . $marker->getAddressLineTwo() . '"'.'city="' . $marker->getCitySuburb() . '"'.'state="' . $marker->getState('fieldName') . '"'.'postal="' . $marker->getPostCode() . '"'.'country="' . $marker->getCountry('fieldName') . '"'.'phone="' . $marker->getPhone() . '"'.'email="' . $marker->getEmail() . '"'.'web="' . $marker->getWebSite() . '"'.'/>';
  }
  '</markers>';
  ?>

但我最终得到的是:

  1. $data 变量中没有任何内容
  2. 由于某种原因,每个项目都嵌套在前一个项目中

基本上我想达到以下结果:

<?php
$data = '<?xml version="1.0" encoding="utf-8"?>
<markers>
    <marker name="Chipotle Minneapolis" lat="44.947464" lng="-93.320826" category="Restaurant" address="3040 Excelsior Blvd" address2="" city="Minneapolis" state="MN" postal="55416" country="US" phone="612-922-6662" email="info@chipotle.com" web="http://www.chipotle.com" />
    <marker name="Chipotle St. Louis Park" lat="44.930810" lng="-93.347877" category="Restaurant" address="5480 Excelsior Blvd." address2="" city="St. Louis Park" state="MN" postal="55416" country="US" phone="952-922-1970" email="info@chipotle.com" web="http://www.chipotle.com" />
    <marker name="Chipotle Minneapolis" lat="44.9553438" lng="-93.29719699999998" category="Restaurant, Bar" address="2600 Hennepin Ave." address2="" city="Minneapolis" state="MN" postal="55404" country="US" phone="612-377-6035" email="info@chipotle.com" web="http://www.chipotle.com" />
</markers>';
?>

谢谢 说

修改后的代码


<?php

$data = simplexml_load_string("<markers />");
foreach ($entries as $entry => $marker ) {
    $newMarker = $data->addChild("marker");
    $newMarker->addAttribute("name", $marker->getName());
    $newMarker->addAttribute("lat", $marker->getLatitude());
    $newMarker->addAttribute("lng", $marker->getLongitude());
    $newMarker->addAttribute("state", $marker->getPostCode());
}

echo $data->asXML();

?>
  <?php
  echo var_dump($data);
  ?>

【问题讨论】:

  • 可能有一种简单的方法来解决它,但为此我需要知道你是如何找到你的entries
  • 嘿,杰克,我从 CMS 获取它们。具体5.

标签: php xml loops foreach


【解决方案1】:

在你使用的第一行之后

$data = '<?xml version="1.0" encoding="utf-8" ?><markers>';

您不会将任何其他文本添加到变量中。你需要使用类似的东西

$data .='<marker name="' . $marker->getName() .` 

(在= 前面加上点来添加值),您还需要注意空格和引号。

我还建议使用 SimpleXML 之类的东西来构建 XML,而不是使用 put 文本,它的代码更长但更安全。比如……

$xml = simplexml_load_string("<markers />");
foreach ($entries as $entry => $marker ) {
    $newMarker = $xml->addChild("marker");
    $newMarker->addAttribute("name", $marker->getName());
    $newMarker->addAttribute("lat", $marker->getLatitude());
    $newMarker->addAttribute("lng", $marker->getLongitude());
    // Repeat for all attributes
}

echo $xml->asXML();

【讨论】:

  • 感谢 Nigel 的回复,感谢,XML 似乎可以工作,但由于某种原因,标记嵌套在前一个标记中(请参见添加的图像)并且不确定 $data 加载时与加载时相同我做了一个 var_dump($data);它返回 php 数组而不是 xml。我添加了修改后的代码
  • @说,忽略var_dump($data);,输出应该来自echo $xml-&gt;asXML();。使用此代码,我无法重现嵌套的 &lt;marker&gt; 元素。
【解决方案2】:

由于我不清楚$entries 是如何生成的,我将在几个数组中组成一些数据,并在of a function borrowed from here. 的帮助下创建预期输出的简化版本显然,您需要修改它以适合您的实际代码。

$data = <<<XML
<?xml version="1.0" encoding="utf-8"?>
<markers>
</markers> 
XML;

$xml = simplexml_load_string($data);

function sxml_append(SimpleXMLElement $to, SimpleXMLElement $from) {
    $toDom = dom_import_simplexml($to);
    $fromDom = dom_import_simplexml($from);
    $toDom->appendChild($toDom->ownerDocument->importNode($fromDom, true));
}


$stores = ["Chipotle Chicago","Chipotle St. Louis Park","Chipotle Minneapolis"];
$locations = ["Chicago","St. Louis Park","Minneapolis"];
$destination = $xml->xpath('//markers');

foreach(array_combine($stores, $locations) as $store => $location) {
$tm = simplexml_load_string('<marker name="xxx" city="yyy"/>');
$tmxml = $tm->xpath('//marker')[0];
$tmxml['name'] = $store;
$tmxml['city']  = $location;
sxml_append($destination[0], $tmxml);
}

echo $xml->asXML();

输出:

    <?xml version="1.0" encoding="UTF-8"?>
<markers>
   <marker name="Chipotle Chicago" city="Chicago" />
   <marker name="Chipotle St. Louis Park" city="St. Louis Park" />
   <marker name="Chipotle Minneapolis" city="Minneapolis" />
</markers>

【讨论】:

    猜你喜欢
    • 2016-11-05
    • 2020-01-14
    • 2015-02-06
    • 2021-05-14
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    相关资源
    最近更新 更多