извлечение узлов из файла XML и расширение его. Я получаю эти ошибки Вызов функции-члена addChild () на ноль?

Привет, я пытаюсь найти указанные номера в файле 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. А затем попытайтесь спасти их с новым ребенком. Но это говорит:

Вызов функции-члена addChild () в null »

на этой линии:

$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-> 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]);
}
}

1

Решение

Рассматривать 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!@#$%^&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);
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector