如何在发送到Web服务之前清理xml请求

时间:2013-10-08 15:10:44

标签: php xml service web

美好的一天,我正在尝试将xml发送到Web服务,但需要在发送之前清理xml。到目前为止,我尝试了不同的方法,现在已经停留了一段时间。

我从表单中捕获数据并将其发布到我的php文件进行处理。如果用户没有输入长度/宽度/高度的任何数据,那么我想清理我的xml并删除空元素,这样它就可以在发送xml请求的服务器上通过验证。

下面是我帖子中的数据片段并相应地构建xml文件,但是如果省略了维度呢?我还可以清理其他空的元素吗?

$xmlRequest = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<mailing-scenario xmlns="http://www.mysite.com/ws/ship/rate-v2">
<customer-number>{$mailedBy}</customer-number>
  <parcel-characteristics>
    <weight>{$weight}</weight>
      <dimensions>
        <length>{$length}</length>
        <width>{$width}</width>
        <height>{$height}</height>
      </dimensions>
  </parcel-characteristics>
<origin-postal-code>{$originPostalCode}</origin-postal-code>
<destination>
<domestic>
 <postal-code>{$postalCode}</postal-code>
</domestic>
</destination>
</mailing-scenario>
XML;


$xmlRequest = phpquery::newDocument(); 
$xp = new DOMXPath($xmlRequest->getDOMDocument());
foreach($xp->query('//*[not(node()) or normalize-space() = ""]') as $node) {
$node->parentNode->removeChild($node);
} 

1 个答案:

答案 0 :(得分:0)

好的,这里只是一个简单的dom的例子。也许首先要点一点,如果没有给出客户编号或负重,你将决定该怎么办,...... 因此,您必须清理XML,但有时清理它会使请求无效或用户可能得到一些他没想到的结果。例如,他可能会将1kg作为权重移除kg,因为权重是在g中设置的,而字符串则是错误的。如果你不告诉用户他可能会对你大喊大叫!
而且只是因为所有节点都有效并不意味着请求是正确的,因为可能存在一些丢失的节点,因此您还必须检查要求!

效率最后一句话,如果您可以从没有XML的用户那里获得所有这些字段,因为用户一次只发送一个包裹。这样做,只是检查数据是否正确 如果你必须使用XML,那么只需一次发送一个包,你只需获取数据就可以检查有效性并重新构建经过验证的XML。

如果我知道这些XML请求可能非常广泛和/或格式复杂,我会使用这个例子。

function cleanXML($data){
    // ok the data is string! So get your node.
    $node = simplexml_load_string($data);

    // now we can iterate throught all child nodes:
    foreach($node->children() as $child){
        //so here we got the childrens

        // All child nodes of the root should be mailing scenarios
        if($child->getName() == "mailing-scenario"){
            //otherwise we check if mailing scenario is valid
            if(!validateMScenario($child)){
                //This node seems not so valid
                //you have to decide what to do now!
            }
        }
        else{
            //Here we remove all nodes that are different
            unset($child[0]);

            echo "Error: Needed to remove Node";
        }
    }

    // Just give them their cleaned XML!
    return $node->asXML();
}


function validateMScenario($ms){
    // These var's safe if the requirements are fullfilled
    $is_customer_number_set = 0
    $is_weight_set = 0
    $is_package_set = 0

    // Again iterate over nodes
    foreach($ms->children as $child){

        //check for customer number
        if($child->getName() == "customerNumber"){
            if($is_customer_number_set == 1){
                echo "You just need one customer number I guess?!"
                return -1
            }

            value = (string) $child;

            // Check if customer number is existing
            if(strlen(value) == 0 || !is_int(value) || intval(value) == -1){
                echo "Dude you need a number!";
                return -1
            }

            $is_customer_number_set = 0;
        }
        else if($node->getName() == "parcel-characteristics"){
             //Ok I hope it should be pretty clear what to do here!
             //...
        }
        else{
             //Remove node again?
        }
    }

    // All requirements fullfilled?
    return ($is_customer_number_set && $is_weight_set && $is_package_set);
}