【问题标题】:extracting Nodes from a XML file and extending it. I get these errors Call to a member function addChild() on null?从 XML 文件中提取节点并对其进行扩展。我收到这些错误 Call to a member function addChild() on null?
【发布时间】:2018-04-15 15:29:20
【问题描述】:

嘿,我正在尝试在 XML 文件中搜索指定的数字。之后我想扩展文件。我希望文件看起来像这样。

原始文件如下所示。

<products>
     <product>
        <OrderingInfo>
            <item name="Part No.">12345 (text)</item>
            <item name="Part No.">12345IP (text)</item>
        </OrderingInfo>
        <varitems>
        </varitems>
    </product>

     <product>
        <OrderingInfo>
            <item name="Part No.">001 (text)</item>
            <item name="Part No.">002 (text)</item>
        </OrderingInfo>
        <varitems>
        </varitems>
     </product>
</products>

我想要的输出:

<products>
     <product>
        <OrderingInfo>
            <item name="Part No.">12345 (text)</item>
            <item name="Part No.">12345IP (text)</item>
        </OrderingInfo>
        <varitems>
            <item>
              <varno>14205</varno>
              <text>text</text>

            </item>
            <item>
              <varno>14205IP</varno>
              <text>text</text>
            </item>
        </varitems>
    </product>

     <product>
        <OrderingInfo>
            <item name="Part No.">001</item>
            <item name="Part No.">002</item>
        </OrderingInfo>
        <varitems>
            <item>
              <varno>001</varno>
            </item>
            <item>
              <varno>002</varno>
            </item>
        </varitems>
     </product>
</products>

首先,我进入第一个产品并获取 OrderingInfo 的值。然后尝试用一个新的孩子来拯救他们。但它说:

在 null 上调用成员函数 addChild()"

在那一行:

$sxml->product[$i]->varitems->item[$l]->addChild('varno', $ordernr[0]);

但是,当我这样做时(由产品留下[$i]):

$sxml->product->varitems->item[$l]->addChild('varno', $ordernr[0]);

它有效,但首先添加了所有内容。

我完全没有想法。希望有人能帮帮我谢谢!

$xml = simplexml_load_file("OriginalFile.xml") or die("Error: Cannot create object"); $sxml = new SimpleXMLElement($xml->asXML());

for ($i = 0; $i < $XMLlenght; $i++) {

$length = count($xml->product[$i]->OrderingInfo->item);

for ($l = 0; $l < $length; $l++) {

    $sxml->product->varitems->addChild("item");

    $searchpattern = '/[0-9]*$/';
    preg_match($searchpattern, $xml->product[$i]->OrderingInfo->item[$l], $ordernr);
    if ($varnr[0] != '') {
        $sxml->product[$i]->varitems->item[$l]->addChild('varno', $ordernr[0]);
    }
}

【问题讨论】:

  • 原始 XML 文件看起来如何?
  • 我添加了原始文件
  • 太棒了!请发布更完整的代码,尤其是变量赋值。 $sxml 是什么?与 $xml? 相同

标签: php xml simplexml


【解决方案1】:

考虑XSLT,一种用于转换XML 文件的专用语言,可以用PHP 的php-xsl 类调用。具体运行Identity Transform(按原样复制文档)然后重写&lt;varitems&gt;以映射祖先product/OrderingInfo /item节点:

XSLT (另存为.xsl)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes" method="xml"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
  </xsl:template> 

  <xsl:template match="varitems">
    <xsl:copy>
        <xsl:for-each select="ancestor::product/OrderingInfo/item">
          <item>
             <varno><xsl:value-of select="normalize-space(translate(., 
                     'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&amp;*()', ''))"/></varno>
              <text><xsl:value-of select="normalize-space(translate(., '0123456789', ''))"/></text>
          </item>
        </xsl:for-each>  
    </xsl:copy>    
  </xsl:template>

</xsl:stylesheet>

PHP

$xml = new DOMDocument;
$xml->load('Input.xml');

$xsl = new DOMDocument;
$xsl->load('XSLTScript.xsl');

// Configure transformer
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);

// Transform XML source
$newXML = new DOMDocument;
$newXML = $proc->transformToXML($xml);

// Output to console
echo $newXML;

// Output to file
file_put_contents('Output.xml', $newXML);

【讨论】:

  • 使用 XSLT 我可以从我的原始文件中获取值并将它们设置为一个新文件,就像我对我的 php 代码所做的那样?
  • XSLT 在转换原始输入 XML 源时不包含任何数据。我会在此处发布输出,但这正是您想要的结果。
  • 我可以在 php 文件中构建 prep_match() 吗?
  • 您可以使用setParameter 将参数传递到XSLT。我看到你尝试正则表达式。显示更多需要对节点值进行数字检查的 XML。他们的节点是不是没有编号?
  • 有时数字后面有文字,我想提取与文字分开的数字。我添加了 xml 和我想要的输出
猜你喜欢
  • 1970-01-01
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-27
  • 2022-12-29
  • 1970-01-01
  • 2022-12-02
相关资源
最近更新 更多