使用XML通过PHP计算费率

时间:2013-02-12 12:59:09

标签: php xml class

我有点卡住了,我希望对PHP更熟悉的人能够帮助我。基本上我正在编写一个PHP应用程序,它允许您通过XML文件插入产品。当我说产品时,我的意思是汽车租赁或保险类产品,其中有填写表格和计算费率。我选择了一种XML结构,以便在将来添加新内容或在没有任何编码知识的情况下对其进行调整,因为底层类将完成所有工作。 然而,我现在正试图以最安全和最好的方式将我的大脑包含在XML文件结构中并在PHP中进行评估,而没有任何被利用的风险。 因此,例如,我将为费率计算区域提供的xml文件结构可能类似于

<rates>
  <rate name="variable1" type="forminput" relative="form['input1']"></rate>
  <rate name="variable2" type="forminput" relative="form['input2']"></rate>
  <rate name="calculatedvariable1" type="calculation">[variable1] * [variable2]</rate>
</rates>

好的,所以这是一个非常基本的例子,但我的想法是我的类然后读取名称,使用xml解析器基于此创建一个php变量,使用表单中给出的值(或亲属引用的任何地方)然后当它找到一个计算类型时,它会将正确命名的变量(用方括号或其他东西标注)插入到计算中并进行计算。 因此,在此示例中,解析计算所给出的输出将为:

$variable1 * $variable2

然后需要将其作为计算运行以获取computedvariable1的值。现在我知道我可以使用eval()来实现这一点,但我不相信这是唯一的选择,也许我错过了我可能在我的xml结构或我的php将解析它的方式做的其他事情。 无论如何,我希望我已经正确地解释了它,并提前感谢任何想法。

1 个答案:

答案 0 :(得分:2)

考虑到您已经解决了从基于relative属性的字符串形式的表单中检索值的问题 - 在此处命名实现resolve_variable($relative)

然后,您可以将值分配给元素本身,并以标准xpath 1.0表达式的形式表示您的计算,如:

rate[@name="variable1"] * rate[@name="variable2"]

XML中的表达式:

<rates>
  <rate name="variable1" type="forminput" relative="form['input1']"></rate>
  <rate name="variable2" type="forminput" relative="form['input2']"></rate>
  <rate name="calculatedvariable1" type="calculation">
    rate[@name="variable1"] * rate[@name="variable2"]
  </rate>
</rates>

您在PHP中所需要的只是为DOMXPath使用DOMDocument对象:

$dom = new DOMDocument();
$dom->loadXML($xml); 
$xpath = new DOMXPath($dom);

然后,您可以将值分配给节点:

// assign values
foreach ($xpath->query('rate/@relative') as $relative) {
    $relative->ownerElement->nodeValue = resolve_variable($relative);
}

然后执行所有计算:

// do calculations
$results = array();
foreach ($xpath->query('rate[@type="calculation"]') as $calculation) {
    $results[$calculation->getAttribute('name')]
        = $xpath->evaluate($calculation->nodeValue);
}

然后它们以$results数组的形式很好地出现(在我的例子中,我有3和5作为值):

Array
(
    [calculatedvariable1] => 15
)

也许这对你有帮助。

请注意,如果您需要精确的计算,浮点算术可能会妨碍您http://www.validlab.com/goldberg/paper.pdf

一瞥整个图片/上面的视图的工作示例:http://eval.in/9595

您也可以这样做with XSL