嘿,我正在尝试在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”)或die(“错误:无法创建对象”); $ sxml = new SimpleXMLElement($ xml-&gt; 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]);
}
}
答案 0 :(得分:0)
考虑XSLT,这是转换XML文件的专用语言,可以使用PHP的php-xsl类调用。具体运行Identity Transform(按原样复制文档),然后重写<varitems>
以映射祖先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!@#$%^&*()', ''))"/></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);