【问题标题】:Find an attribute in an XML document and output children in PHP在 XML 文档中查找属性并在 PHP 中输​​出子项
【发布时间】:2017-02-16 18:54:30
【问题描述】:

我已将我的 PHP 代码包含在我从中检索数据的 XML 文件的 sn-p 中。

我想显示来自 XML 文件的数据,类似于我将它用作 ID 的方式。在 ID 中,它使用 ID 作为索引,但我发现它不能用作日期。

我的第一个想法是只使用 xPath 并将其保留为这样,但我想以类似的方式格式化我的数据以保持一致性。

作为 PHP 和 XML 的初学者,任何可以进一步学习语言或格式样式的见解或文档将不胜感激。

我遇到的问题是找到已输入的相关属性的索引值,并以ID搜索等格式单独输出。

<?php
if($_GET["SearchChoice"] == "ID Search"){ #WORKING FINDS THE VALUE OF DATA NEEDED
    $xml=simplexml_load_file("XMLtest.xml") or die("Error: Cannot create object");
    $passID = intval($_GET["IDsend"]);
    if ($passID !== 0){
        $passID = $passID - 1;
    }
    #echo $xml['date'];
    #echo var_dump((string)$xml['date']);
    $attr = $xml->finances[$passID]->attributes();
    echo "Date: ";
    echo $attr['date'];
    echo $xml->finances[$passID]->day . ",<br>Projection: ";
    echo $xml->finances[$passID]->projection . ",<br>Recommended Staff: ";
    echo $xml->finances[$passID]->recommendedStaff . ",<br>Staff Wages: ";
    echo $xml->finances[$passID]->staffWages . ",<br>Actual: ";
    echo $xml->finances[$passID]->actual . "<br>";
}
elseif($_GET["SearchChoice"] == "Date Search") { 
    $xml=simplexml_load_file("XMLtest.xml") or die("Error: Cannot create object");
    $passDate = strval($_GET["DateSend"]);
    $nodes = $xml->xpath("/january/finances[@date='". $passDate . "']"); # Instead of xpath possiblity: loop through to find date then output it similar to ID Search?
    print_r($nodes);
}
else {
    echo "Error 1 <br>";
    echo $_GET["SearchChoice"];
}

这是 XML 的一部分:

<?xml version="1.0" encoding="UTF-8"?>
<january>
    <finances id="1" date="01-01-2016">
        <projection>414</projection>
        <recommendedStaff>20</recommendedStaff>
        <staffWages>100</staffWages>
        <actual>250</actual>
    </finances>
    <finances id="2" date="02-01-2016">
        <year>2016</year>
        <month>01</month>
        <day>02</day>
        <projection>124</projection>
        <recommendedStaff>8</recommendedStaff>
        <staffWages>150</staffWages>
        <actual>250</actual>
    </finances>
    <finances id="3" date="03-01-2016">
        <projection>687</projection>
        <recommendedStaff>20</recommendedStaff>
        <staffWages>150</staffWages>
        <actual>250</actual>
    </finances>
    <finances id="4" date="04-01-2016">
        <projection>587</projection>
        <recommendedStaff>15</recommendedStaff>
        <staffWages>150</staffWages>
        <actual>250</actual>
    </finances>
    <finances id="5" date="05-01-2016">
        <projection>124</projection>
        <recommendedStaff>5</recommendedStaff>
        <staffWages>150</staffWages>
        <actual>250</actual>
    </finances>
    <finances id="6" date="06-01-2016">
        <projection>874</projection>
        <recommendedStaff>22</recommendedStaff>
        <staffWages>150</staffWages>
        <actual>250</actual>
    </finances>
</january>

【问题讨论】:

  • 您没有解释您要解决的问题是什么,以及为什么提供的代码不起作用。见stackoverflow.com/help/how-to-ask
  • @miken32 原谅我,我现在已经澄清了我的帖子。
  • 没有理由不能以与使用 ID 完全相同的方式使用日期,您只需要确保以完全相同的方式格式化日期,因为 XML 将其视为字符串.
  • @Mike 我不认为这会起作用,因为我认为 ID 搜索变成了索引值?
  • @Mike 你能举个例子吗,我用的方法完全一样,但是输出为空。

标签: php xml xpath


【解决方案1】:
$xml=simplexml_load_file("XMLtest.xml") or die("Error: Cannot create object");

switch ($_GET["SearchChoice"])
{
  case 'ID Search':
    $nodes = $xml->finances[$passID];
    break;
  case 'Date Search':
     $passDate = strval($_GET["DateSend"]);
     $nodes = $xml->xpath("/january/finances[@date='". $passDate . "']");
     if  ($nodes)
         $nodes = array_shift($nodes);   //  First match
     break;
  default:
    $nodes = NULL;
}

if  ($nodes)  //  Don't care how we got them
{
    echo $nodes->day . ",<br>Projection: ";
    //  etc
}

这会在开始时加载文件,然后根据您的搜索选择创建一个节点(存储在 $nodes 中)(熟悉 switch 语句 - 非常有用,尤其是使用或不使用时的“break”命令)。

在 switch 语句之后,无论你如何获得它,你都有一个节点。这是编码的好习惯——条件是“照顾”的,从现在开始就不是问题了。

实际上,对这两个选项都使用 xpath 可能是一个更好的主意 - 不同代码路径之间的最小差异使调试和维护更容易。

【讨论】:

  • 您能否解释一下这究竟是做什么的,正如 PHP 和任何 XML 类型格式的新手所说。因此,在 case 语句中它没有任何意义。
  • 好点。我从早些时候引入了一些 cmets,并扩展了我的答案以包括一些解释。在代码中思考要容易得多!
猜你喜欢
  • 1970-01-01
  • 2016-04-08
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
  • 2016-04-28
  • 2014-10-06
  • 1970-01-01
  • 2014-08-23
相关资源
最近更新 更多