regex从php中的xml节点提取数据


regex to extract data from xml nodes in php

这是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>

我想提取产品编号、前缀编号、库存编号和制造商库存编号

你能建议如何在php中使用regex吗?

我不想使用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

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

Regex完全不适合这份工作。请改用PHP的XML扩展(如DOMDocument)。

如果文件是有效的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);