Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从XML文件中提取节点并对其进行扩展。我在null上调用成员函数addChild()时遇到这些错误?_Php_Xml_Simplexml - Fatal编程技术网

Php 从XML文件中提取节点并对其进行扩展。我在null上调用成员函数addChild()时遇到这些错误?

Php 从XML文件中提取节点并对其进行扩展。我在null上调用成员函数addChild()时遇到这些错误?,php,xml,simplexml,Php,Xml,Simplexml,嘿,我正在尝试在XML文件中搜索指定的数字。之后,我想扩展该文件。我想让文件看起来像这样 <products> <product> <OrderingInfo> <item name="Part No.">12345 (text)</item> <item name="Part No.">12345IP (text)</item>

嘿,我正在尝试在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>
        </varitems>
    </product>

     <product>
        <OrderingInfo>
            <item name="Part No.">001 (text)</item>
            <item name="Part No.">002 (text)</item>
        </OrderingInfo>
        <varitems>
        </varitems>
     </product>
</products>
但是,当我这样做时(将
[$I]
留给产品):

它可以工作,但会在第一时间添加所有内容

我完全没有主意了。我希望有人能帮我谢谢你

$xml=simplexml\u加载文件(“OriginalFile.xml”)或die(“错误:无法创建对象”); $sxml=newsimplexmlement($xml->asXML())

($i=0;$i<$xmlenght;$i++)的
{
$length=count($xml->product[$i]->orderininfo->item);
对于($l=0;$l<$length;$l++){
$sxml->product->varitems->addChild(“项目”);
$searchpattern='/[0-9]*$/';
preg_match($searchpattern,$xml->product[$i]->orderininfo->item[$l],$ordernr);
如果($varnr[0]!=''){
$sxml->product[$i]->varitems->item[$l]->addChild('varno',$ordernr[0]);
}
}
考虑一种特殊用途的语言,用于转换可通过PHP类调用的XML文件。具体运行(按原样复制文档),然后重写
以映射到祖先
产品/orderinfo/item
节点:

XSLT(另存为.xsl)

请考虑转换XML文件的专用语言,可使用PHP类调用该语言。具体来说,请运行(按原样复制文档),然后重写
,以映射到祖先
产品/orderininfo/item
节点:

XSLT(另存为.xsl)


原始XML文件看起来怎么样?我添加了原始文件很棒!请发布更完整的代码,特别是变量赋值。什么是$sxml?与$XML相同?原始XML文件看起来怎么样?我添加了原始文件很棒!请发布更完整的代码,特别是变量赋值。什么是$sxml?与$XML相同?使用XSLT,我可以从原始文件中获取值文件并将它们设置为一个新的文件,就像我对php代码所做的那样?XSLT在转换原始输入XML源时不包含任何数据。我会在这里发布输出,但这正是您想要的结果。我可以构建prep_match()吗到php文件中?您可以使用将参数传递到XSLT。我看到您尝试使用regex。显示更多需要对节点值进行数字检查的XML。它们的节点是否没有数字?有时数字后面有文本,我希望提取与文本分开的数字。我使用XSLT添加了XML和所需的输出,我可以使用从原始文件中提取t值并将其设置为新的值,就像我在php代码中所做的那样?XSLT在转换原始输入XML源时不包含任何数据。我会在此处发布输出,但这正是您想要的结果。我可以构建prep_match()吗进入php文件?您可以使用将参数传递到XSLT。我看到您尝试使用regex。显示更多需要对节点值进行数字检查的XML。它们的节点是否没有数字?有时数字后面有文本,我希望提取与文本分开的数字。我添加了XML和所需的输出
$sxml->product[$i]->varitems->item[$l]->addChild('varno', $ordernr[0]);
$sxml->product->varitems->item[$l]->addChild('varno', $ordernr[0]);
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]);
    }
}
<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>
$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);