使用 foreach 可避免冗余的 XPath 表单处理代码



已回答@ setAttribute未保存回XML页面

我的 XML 如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<facilities>
    <areas>
        <area name="Rocket">
            <trails>
                <trail name="Trail 1" status="CLOSED" />
                <trail name="Trail 2" status="CLOSED" />
                <trail name="Trail 2" status="CLOSED" />
            </trails>
        </area>
    </areas>
</facilities>

我能够使用以下代码成功编辑属性:

<script src="http://code.jquery.com/jquery-latest.min.js"></script>
 <?php
 $xml = new DOMDocument('1.0', 'utf-8');
 $xml->formatOutput = true; 
 $xml->preserveWhiteSpace = false;
 $xml->load('example.xml');
 $xpath = new DOMXpath($xml);
 $asstatus = $xpath->query("//facilities/areas/area[@name='Rocket']/trails/trail[@name='Trail 1']/@status")->item(0);
$childForm = '';
foreach ( $xpath->query("//trails/trail") as $trail )   {
  $childForm .= "<form action=''>
  <span class="title">".$trail->getAttribute("name")."</span> <span class="title">Status</span>
  <select name="asstatusform" >
  <option selected value=".$trail->getAttribute("status").">".$trail->getAttribute("status")."</option>
  <option value="OPEN">OPEN</option>
  <option value="CLOSED">CLOSED</option>
  <option value="RACING CLOSURE">RACING CLOSURE</option>
  </select></span>
  <br>
  </form>";
}
 ?>
 <form action="" method="POST">
    <?php echo $childForm; ?>
    <input name="submit" type="submit" value="Save" />
</form>
 <?php
 if (isset($_POST['submit']))
 {
$trail->setAttribute('status', $_POST['asstatusform']);
htmlentities($xml->save('example.xml'));
 }
 ?>

想知道是否有一种简单的方法可以将其更改为用于 foreach,这样我就不必为每个单独的跟踪名称创建新的查询和表单。到目前为止,我已经尝试了一些变化,但没有取得很大的成功。

使用 XPath 获取跟踪列表,然后为每个跟踪获取显示属性的简单组合。

foreach ( $xpath->query("//trails/trail") as $trail )   {
    echo $trail->getAttribute("name")."/".
          $trail->getAttribute("status").PHP_EOL;
}

您可以决定如何显示此数据 - 单独的表单/表格等。

代码中的输出从回显数据切换到具有嵌入式 PHP 的 HTML。 您需要保持一致,并确保它也正确嵌套您的报价。 以下内容应该在循环中工作...

    echo "<form method="POST" action=''>
  <span class="title">".$trail->getAttribute("name")."</span> <span class="title">Status</span>
  <select name="asstatusform" >
  <option selected value=".$trail->getAttribute("status").">".$trail->getAttribute("status")."</option>
  <option value="OPEN">OPEN</option>
  <option value="CLOSED">CLOSED</option>
  <option value="RACING CLOSURE">RACING CLOSURE</option>
  </select></span>
  <br>
  <input name="submit" type="submit" value="Save" />
  </form>";

最新更新