首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在mysql中用parent创建多行,用PHP对子XML循环

在mysql中用parent创建多行,用PHP对子XML循环
EN

Stack Overflow用户
提问于 2017-02-12 03:21:12
回答 2查看 378关注 0票数 0

我在做一张材料清单表格。我的XML父节点是我们正在制作的产品,子节点是BOM行,例如

代码语言:javascript
复制
<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插入一个单行,以及父产品信息;

代码语言:javascript
复制
TABLE bom
id      productCode      lineCode       qty
1       PROD-1            Widget-1      111
2       PROD-1            Widget-2      222
3       PROD-1            Widget-3      333

这是我到目前为止拥有的代码,但我不能以这种方式获得父母信息;

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

发布于 2017-02-12 03:27:27

如果我以正确的方式理解您,并基于您尝试的代码,我相信您可以通过以下方式获得父产品:

代码语言:javascript
复制
$BOMXml->BOM->ProductName

“之前”的foreach循环。

票数 0
EN

Stack Overflow用户

发布于 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和代码)

代码语言:javascript
复制
$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>';");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42180197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档