我需要对我使用的xml标签进行一些更改。我需要在其他标签中收集其中一些标签。 例如:
<image> image_url </image>
the tags
<Images>
<Image> image_url <image>
</Images>
必须
我可能还需要在现有标签下方或上方使用一些标签
例如:
<productname> pr_name </productname>
<newproductname> pr_name </newproductname>
测试xml输出:
<Root>
<Products>
<Product>
<productname> pr_name </productname>
<price> pr_price </price>
<sku> pr_sku </sku>
<Image> image_url <image>
<Product>
</Products>
</Root>
我要这样:)
<Root>
<Products>
<Product>
<newproductname> pr_name </newproductname>
<productname> pr_name </productname>
<price> pr_price </price>
<sku> pr_sku </sku>
<Images>
<Image> image_url <image>
</Images>
<newsku> pr_newsku </newsku>
<Product>
</Products>
</Root>
如何更改我喜欢的结构。
header('Content-Type: application/xml');
$xml = new DOMDocument();
$xml->preserveWhiteSpace = false;
$xml->formatOutput = true;
$xml->load('test.xml');
$xml_string = $xml->saveXML();
echo $xml_string;
答案 0 :(得分:0)
鉴于下面的示例XML(基于问题中引用的XML,但已进行了稍微扩展并纠正了格式错误的XML,如上所示),可以通过小心使用DOMXPath
和{{ 1}}-对后者稍作改动即可实际执行insertBefore
insertAfter
调试打印(以上$xml='<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Products>
<Product>
<productname> pr_name 1</productname>
<price> pr_price 1</price>
<sku> pr_sku 1</sku>
<Image> image_url 1.1</Image>
<Image> image_url 1.2</Image>
</Product>
<Product>
<productname> pr_name 2</productname>
<price> pr_price 2</price>
<sku> pr_sku 2</sku>
<Image> image_url 2</Image>
</Product>
<Product>
<productname> pr_name 3</productname>
<price> pr_price 3</price>
<sku> pr_sku 3</sku>
<Image> image_url 3.1</Image>
<Image> image_url 3.2</Image>
<Image> image_url 3.3</Image>
</Product>
<Product>
<productname> pr_name 4</productname>
<price> pr_price 4</price>
<sku> pr_sku 4</sku>
</Product>
</Products>
</Root>';
$dom=new DOMDocument('1.0','utf-8');
$dom->formatOutput=true;
$dom->validateOnParse=false;
$dom->recover=true;
$dom->strictErrorChecking=false;
$dom->preserveWhiteSpace=false;
$dom->loadXML( $xml );
$errors = libxml_get_errors();
libxml_clear_errors();
$xp=new DOMXPath( $dom );
$col=$xp->query( '//Products/Product' );
if( $col->length > 0 ){
foreach( $col as $node ){
/* Get the `productname` and create a new element before with same value */
$productname=$xp->query( 'productname', $node )->item(0);
$newproductname=$dom->createElement( 'newproductname', $productname->textContent );
$node->insertBefore( $newproductname, $productname );
/* Find all the Image tags within parent */
$ref=$xp->query( 'Image', $node );
/* determine reference node to use for `insertBefore` */
if( $ref && $ref->length > 0 )$refNode=$ref->item(0);
else $refNode=$node->lastChild;
/* create a new `Images` node */
$oImages=$dom->createElement('Images');
$node->insertBefore( $oImages, $refNode );
/* using previously discovered `Image` nodes, add to the new `Images` element */
foreach( $ref as $img )$oImages->appendChild( $img );
}
}
/* for demo display */
printf('<pre>%s</pre>',print_r( htmlentities( $dom->saveXML() ), true ) );
/* For real output */
#header( 'Content-Type: application/xml' );
#exit( $dom->saveXML() );
)的输出如下,我相信,除了上面显示的未提及的printf
标记之外,所需的输出格式也是如此:
newsku