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