正则表达式从php中的xml节点中提取数据

时间:2012-01-24 05:17:56

标签: php xml regex

这是XML

<us:ItemMaster>
     <us:ItemMasterHeader>
        <oa:ItemID agencyRole="Product_Number">
           <oa:ID>9227950</oa:ID>
        </oa:ItemID>
        <oa:ItemID agencyRole="Prefix_Number">
           <oa:ID>AAG</oa:ID>
        </oa:ItemID>
        <oa:ItemID agencyRole="Stock_Number_Butted">
           <oa:ID>5035</oa:ID>
        </oa:ItemID>
        <oa:ItemID agencyRole="Manufacturer_Sku_Number">
           <oa:ID>5035</oa:ID>
        </oa:ItemID>
     </us:ItemMasterHeader>
</us:ItemMaster>

我想提取 Product_Number,Prefix_Number,Stock_Number_Butted和Manufacturer_Sku_Number

你能建议如何在php中使用正则表达式吗?

我不想为此使用xml解析器,这是非常冗长的,因为我有很多大的xml文件需要处理。

谢谢!


更新

对于那些寻求相同的人 找到 xpath 是最好的方法,我发现此链接非常有用。 这是代码:

<?php 
echo "<pre>";
$info = array();
$xmlStr = file_get_contents("http://officedealersolution.highviews.co.cc/sftp/ecdb.individual_items/AAG5035.xml");
$xml = new SimpleXMLElement($xmlStr); 
$res = $xml->xpath("//us:DataArea/us:ItemMaster/us:ItemMasterHeader/oa:ItemID[@agencyRole=\"Product_Number\"]/oa:ID"); 
$info['Product_Number'] = $res[0];
$res = $xml->xpath("//us:DataArea/us:ItemMaster/us:ItemMasterHeader/oa:ItemID[@agencyRole=\"Prefix_Number\"]/oa:ID"); 
$info['Prefix_Number'] = $res[0];
$res = $xml->xpath("//us:DataArea/us:ItemMaster/us:ItemMasterHeader/oa:ItemID[@agencyRole=\"Stock_Number_Butted\"]/oa:ID"); 
$info['Stock_Number_Butted'] = $res[0];
$res = $xml->xpath("//us:DataArea/us:ItemMaster/us:ItemMasterHeader/oa:ItemID[@agencyRole=\"Manufacturer_Sku_Number\"]/oa:ID"); 
$info['Manufacturer_Sku_Number'] = $res[0];
print_r($info);
echo "</pre>";
?>

输出:

Array
(
    [Product_Number] => SimpleXMLElement Object
        (
            [0] => 9227950
        )

    [Prefix_Number] => SimpleXMLElement Object
        (
            [0] => AAG
        )

    [Stock_Number_Butted] => SimpleXMLElement Object
        (
            [0] => 5035
        )

    [Manufacturer_Sku_Number] => SimpleXMLElement Object
        (
            [0] => 5035
        )

)

这是w3schools的一个非常好的xpath教程 http://www.w3schools.com/xpath/xpath_syntax.asp

2 个答案:

答案 0 :(得分:1)

当你使用的只是锤子时,一切看起来像钉子。

正则表达式完全是错误的工具。使用PHP的XML扩展之一(例如DOMDocument)。

答案 1 :(得分:1)

如果文件是有效的 XML,则以下代码将获得您想要的内容假设$data包含XML数据为字符串

$xml = new SimpleXmlElement($data);
$nss = $xml->getNamespaces(true);
$us = $xml->children($nss['us']);
$im = $us->ItemMaster;
$imh = $im->ItemMasterHeader;
$oa = $imh->children($nss['oa']);

$parsed_data=array();

foreach($oa->ItemID as $item_id){
    $attr = $item_id->attributes();
    $role = (string)($attr->agencyRole);
    $id = (string)($item_id->ID);
    $parsed_data[$role] = $id;
}

print_r($parsed_data);