我在做一张材料清单表格。我的XML父节点是我们正在制作的产品,子节点是BOM行,例如
<BOM>
<ProductName>This</ProductName>
<BOMLines>
<BOMLine>
<ProductCode>Widget-1</ProductCode>
<Qty>111</Qty>
</BOMLine>
<BOMLine>
<ProductCode>Widget-2</ProductCode>
<Qty>222</Qty>
</BOMLine>
<BOMLine>
<ProductCode>Widget-3</ProductCode>
<Qty>333</Qty>
</BOMLine>
</BomLines>
</BOM>我的最终目标是,使用PHP为每个BOMLine ProductCode插入一个单行,以及父产品信息;
TABLE bom
id productCode lineCode qty
1 PROD-1 Widget-1 111
2 PROD-1 Widget-2 222
3 PROD-1 Widget-3 333这是我到目前为止拥有的代码,但我不能以这种方式获得父母信息;
function updateBOM() {
$BOMXml = getBOMs('');
foreach ($BOMXml->BOM->BOMLines->BOMLine as $BOM) {
$BOMLine = $BOM->ProductCode;
$BOMQty = $BOM->Qty;
$ParentProduct = $BOMXML->BOM->ProductName
$sql = "INSERT INTO bom (productCode, lineCode, Qty) VALUES ('$ParentProduct', '$BOMLine', '$BOMQty')";
$retval = mysql_query($sql);
if(! $retval ) {
die('Could not enter data: ' . mysql_error());
}
$count += '1';
}运行查询时,我获得了一些数据,但每行的所有父产品都是空的:z
发布于 2017-02-12 03:27:27
如果我以正确的方式理解您,并基于您尝试的代码,我相信您可以通过以下方式获得父产品:
$BOMXml->BOM->ProductName“之前”的foreach循环。
发布于 2017-02-12 05:05:38
考虑使用两种声明性的专用语言: XSLT和SQL!由于MySQL提供了使用LOAD XML命令将XML文件直接导入数据库表的功能,因此需要将原始XML转换为简化的平面结构,以便导入MySQL (转换后的节点与列名对齐)。
在这里,您可以避免迭代追加查询的任何循环。要运行XSLT1.0脚本,PHP需要在.ini文件中启用php_xsl扩展。另外,请注意,因为mysql_*是一个在PHP7中完全删除的已弃用的库,所以SQL调用使用假定已预初始化的mysqli库。喜欢调用这两个引擎: libxslt和MySQL!
SQL (带有嵌入式XSLT和代码)
$doc = new DOMDocument();
$doc->load('Input.xml');
$xsl = new DOMDocument();
$xsl->loadXML('<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" method="xml"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/BOM">
<data>
<xsl:apply-templates select="BOMLines"/>
</data>
</xsl:template>
<xsl:template match="BOMLine">
<row>
<productCode><xsl:value-of select="ancestor::BOM/ProductName"/></productCode>
<lineCode><xsl:value-of select="ProductCode" /></lineCode>
<qty><xsl:value-of select="Qty"/></qty>
</row>
</xsl:template>
</xsl:transform>');
// INITIALIZE AND CONFIGURE TRANSFORMER
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);
// TRANSFORM XML SOURCE
$newXML = $proc->transformToXML($doc);
// SAVE CONTENT TO FILE
file_put_contents('/Output.xml', $newXML);
// RUN SQL COMMAND (IMPORTING FILE WITH FULL PATH REFERENCE)
$mysqli->query("LOAD XML LOCAL INFILE '/path/to/Output.xml'
INTO TABLE bom
ROWS IDENTIFIED BY '<row>';");https://stackoverflow.com/questions/42180197
复制相似问题